android – Kotlin懒惰用法

前端之家收集整理的这篇文章主要介绍了android – 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,但实际上不会初始化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而不是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的一部分,并且在任何你只想引用它的地方,你现在必须引用lazyRealm.value.你要权衡利弊. 原文链接:https://www.f2er.com/android/430338.html

猜你在找的Android相关文章