你需要创建一个扩展ReadWriteProperty
提供该功能的类(代码示例是基于不安全的懒惰实现)
class UninitializedProperty<T>(private val getter:() -> T) : ReadWriteProperty<Any?, T> {
var _value: Any? = UNINITIALIZED_VALUE
@Suppress("UNCHECKED_CAST")
override fun getValue(thisRef: Any?, property: KProperty<*>): T = if(_value === UNINITIALIZED_VALUE) getter() else _value as T
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
_value = value
}
private object UNINITIALIZED_VALUE
}
其次,为了保持恒定符合标准的代表像lazy
定义一个辅助方法:
fun <T> uninitialized(getter:() -> T): ReadWriteProperty<Any?, T> = UninitializedProperty(getter)
现在你可以使用它:
class Foo(val base: FooBase) {
override var number: Int by uninitialized { base.number }
}
说明:该类不是线程安全的。
查看official documentation了解更多关于代表团的信息。
我建议把'私有对象UNINITIALIZED_VALUE'内'UninitializedProperty',而不是沿着它 – voddan
的实施有一个bug。如果它是用'null'初始化呢?为了解决这个问题,你需要比较'_value'和'UNINITIALIZED_VALUE',而不是'null'。 – voddan
@voddan修好了,谢谢。 –