簡體   English   中英

Kotlin懶惰的用法

[英]Kotlin lazy usage

我目前正在我的應用程序中使用Realm,為了確保我正確管理Realm實例,我在我的基本Activity中引入了一個這樣的變量:

protected val realm: Realm by lazy {
        Realm.getDefaultInstance()
}

然后在onDestroy中我這樣做:

override fun onDestroy() {
    super.onDestroy()
    realm.close()
}

然后我意識到這是一種浪費。 如果當前活動不使用領域,它將打開並立即關閉onDestroy

所以我更新到這個:

    private var usedRealm = false

    protected val realm: Realm by lazy {
        usedRealm = true
        Realm.getDefaultInstance()
    }

override fun onDestroy() {
        super.onDestroy()

        if (usedRealm) {
            realm.close()
        }
    }

有沒有辦法完成同樣的事情,沒有額外的旗幟?

  1. 您當前的實施中存在一個錯誤。 如果拋出Realm.getDefaultInstance()那么usedRealm將被設置為true但實際上不會初始化lazy(初始化將失敗)。 您可以通過調用Realm.getDefaultInstance() 之后僅調用usedRealm = true來解決此問題:

     protected val realm: Realm by lazy { val realm = Realm.getDefaultInstance() usedRealm = true realm } 

    要么

     protected val realm: Realm by lazy { Realm.getDefaultInstance().apply { usedRealm = true } } 
  2. 通過保持對原始Lazy對象本身的引用,您可以在沒有額外標志的情況下完成相同的操作:

     private val lazyRealm = lazy { Realm.getDefaultInstance() } protected val realm by lazyRealm override fun onDestroy() { super.onDestroy() if (lazyRealm.isInitialized()) { realm.close() } } 

    這仍然需要一個額外的字段,但您不必再自己維護初始化狀態。

  3. 您也可以直接使用Lazy而不是委托

     protected val lazyRealm = lazy { Realm.getDefaultInstance() } override fun onDestroy() { super.onDestroy() if (lazyRealm.isInitialized()) { lazyRealm.value.close() } } 

    要么

     protected val lazyRealm = lazy { Realm.getDefaultInstance() } override fun onDestroy() { super.onDestroy() with(lazyRealm) { if (isInitialized()) { value.close() } } } 

    這使得它沒有額外的屬性,但是Lazy現在是你的API的一部分,並且在任何你只想引用它的realm你現在必須引用lazyRealm.value 你要權衡利弊。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM