Kotlin懒惰的用法
我目前在我的应用程序中使用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
但是懒惰不会被初始化(初始化失败)。 你可以在调用Realm.getDefaultInstance()
之后调用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
。 你得权衡利弊。 🙂