Kotlin var懒惰的热量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin var懒惰的热量相关的知识,希望对你有一定的参考价值。

我想为var属性做一个懒惰的初始化。由于by lazy仅限于val属性,我必须写这样的东西:

    private var currentContextProvider: ContextProvider? = null
        get() {
            if (field == null) {
                field = DefaultContextProvider()
            }
            return field
        }

而现在我必须处理那些无意义的可控性调用:currentContextProvider?.getContext()或者currentContextProvider!!.getContext()

难道我做错了什么?

答案

您可以决定使用某个默认值对其进行初始化,而不是使其可为空,在第一次访问时,该默认值将替换为延迟计算的值:

private val noInit = "noinit"
var currentContextProvider: String = noInit
        get() = if (field == noInit) {
            synchronized(this) {
                return if (field == noInit) "lazyinit" else field
            }
        } else field

(我用ContextProvider取代了String

Custom Delegate

以下实现了custom delegate重用前一个解决方案。通过定义lazy(),它可以像var currentContextProvider: ContextProvider by LazyMutable(){DefaultContextProvider()}一样使用

class LazyMutable<T>(val initializer: () -> T) : ReadWriteProperty<Any?, T> {
    private object UNINITIALIZED_VALUE
    private var prop: Any? = UNINITIALIZED_VALUE

    @Suppress("UNCHECKED_CAST")
    override fun getValue(thisRef: Any?, property: KProperty<*>): T {
        return if (prop == UNINITIALIZED_VALUE) {
            synchronized(this) {
               return if (prop == UNINITIALIZED_VALUE) initializer().also { prop = it } else prop as T
            }
        } else prop as T
    }

    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        synchronized(this) {
            prop = value
        }
    }
}

以上是关于Kotlin var懒惰的热量的主要内容,如果未能解决你的问题,请参考以下文章

懒惰的 Kotlin 抛出 NullPointerException

如何从片段 KOTLIN 中调用意图 [重复]

如何在 Kotlin 片段内的按钮之间切换片段?

kotlin-从一个片段更改多个片段的小数位

如何在kotlin的片段内显示网格视图?

如何更改片段 Kotlin