這可以通過使用來實現backing property(根據Pavlus的回答);不過,我更願意把它包裝一個delegate內避免暴露其財產的背景之外:
open class LateInit<T: Any> : ReadWriteProperty<Any?, T> {
protected lateinit var field: T
final override fun getValue(thisRef: Any?, property: KProperty<*>) = get()
final override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) = set(value)
open fun get() = field
open fun set(value: T) { field = value }
}
這提供了標準的getter和setter方法,可以用自定義實現覆蓋:
var upperCaseString by object : LateInit<String>() {
override fun set(value: String) {
field = value.toUpperCase()
}
}
然而,因爲此實現需要擴展委託,所以不能從屬性類型推斷出泛型。
class LateInit<T: Any>(private val getter: FieldHolder<T>.() -> T = { field },
private val setter: FieldHolder<T>.(T) -> Unit = { field = it }) :
ReadWriteProperty<Any?, T> {
private val fieldHolder = FieldHolder<T>()
override fun getValue(thisRef: Any?, property: KProperty<*>) = fieldHolder.getter()
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) =
fieldHolder.setter(value)
class FieldHolder<T: Any> {
lateinit var field: T
}
}
然後可以這樣使用:這可以通過採用自定義的getter和setter作爲參數,克服
private var upperCaseString: String by LateInit(setter = { field = it.toUpperCase() })
是'onCreate'建設者的一部分嗎? –
不,這是一個從Activity類繼承的重寫方法,它是由Android作爲應用程序生命週期的一部分調用的。 – xvlcw
爲什麼你需要一個二傳手?聽起來你可以在這裏改進你的架構。 – tynn