当前位置:  开发笔记 > 编程语言 > 正文

Kotlin懒惰的用法

如何解决《Kotlin懒惰的用法》经验,为你挑选了1个好方法。

我目前正在我的应用程序中使用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> mfulton26..:

    您当前的实施中存在一个错误.如果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 }
    }
    

    通过保持对原始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.你要权衡利弊.:-)

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有