[英]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()
}
}
有沒有辦法完成同樣的事情,沒有額外的旗幟?
您當前的實施中存在一個錯誤。 如果拋出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 } }
通過保持對原始Lazy
對象本身的引用,您可以在沒有額外標志的情況下完成相同的操作:
private val lazyRealm = lazy { Realm.getDefaultInstance() } protected val realm by lazyRealm override fun onDestroy() { super.onDestroy() if (lazyRealm.isInitialized()) { realm.close() } }
這仍然需要一個額外的字段,但您不必再自己維護初始化狀態。
您也可以直接使用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.