【问题标题】:Kotlin lazy usageKotlin 懒惰使用
【发布时间】:2016-08-05 17:07:15
【问题描述】:

我目前在我的应用程序中使用 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()
        }
    }

没有额外的标志,有没有什么方法可以做到这一点?

【问题讨论】:

    标签: android realm kotlin


    【解决方案1】:
    1. 您当前的实现中存在错误。如果Realm.getDefaultInstance() 抛出,那么usedRealm 将被设置为true,但惰性实际上不会被初始化(初始化会失败)。您可以通过仅调用usedRealm = true 调用Realm.getDefaultInstance() 来解决此问题:

      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代替as a delegate

      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。你可以权衡利弊。 :-)

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 2022-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2012-06-02
      相关资源
      最近更新 更多