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懒惰的热量的主要内容,如果未能解决你的问题,请参考以下文章