gpt4 book ai didi

delegates - Kotlin var 惰性初始化

转载 作者:行者123 更新时间:2023-12-03 05:12:23 26 4
gpt4 key购买 nike

我想对 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)

自定义委托(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
}
}
}

关于delegates - Kotlin var 惰性初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47947841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com