我想为var属性做一个懒惰的初始化.由于by lazy仅限于val属性我必须写这样的东西:
private var currentContextProvider: ContextProvider? = null
get() {
if (field == null) {
field = DefaultContextProvider()
}
return field
}
Run Code Online (Sandbox Code Playgroud)
现在我必须处理那些毫无意义的可控性通知: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
Run Code Online (Sandbox Code Playgroud)
(我把它换成了ContextProvider带String)
以下实现了重用先前解决方案的自定义委托。可以像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
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1637 次 |
| 最近记录: |