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() } } 

有没有办法做到这一点,没有额外的标志?

  1. 你目前的实施有一个错误。 如果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 } } 
  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 。 你得权衡利弊。 🙂