在我的活动中,我有一个应该是不可为空的字段,并且有一个自定义setter.我想在我的onCreate方法中初始化字段,所以我添加lateinit到我的变量声明中.但是,显然你不能这样做(目前):https://discuss.kotlinlang.org/t/lateinit-modifier-is-not-allowed-on-custom-setter/1999.
这些是我能看到的解决方法:
有人可以推荐一种更好的方式(不涉及删除自定义设置器)吗?
Pav*_*lus 10
将其替换为由nullable属性支持的属性:
var _tmp: String? = null
var tmp: String
get() = _tmp!!
set(value) {_tmp=value; println("tmp set to $value")}
Run Code Online (Sandbox Code Playgroud)
或者这样,如果你想让它与lateinit语义一致:
var _tmp: String? = null
var tmp: String
get() = _tmp ?: throw UninitializedPropertyAccessException("\"tmp\" was queried before being initialized")
set(value) {_tmp=value; println("tmp set to $value")}
Run Code Online (Sandbox Code Playgroud)
这可以通过使用支持属性来实现(根据 Pavlus 的回答);但是,我更喜欢将它包装在一个委托中,以避免将它暴露在属性的上下文之外:
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 }
}
Run Code Online (Sandbox Code Playgroud)
这提供了可以被自定义实现覆盖的标准 getter 和 setter:
var upperCaseString by object : LateInit<String>() {
override fun set(value: String) {
field = value.toUpperCase()
}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于此实现需要扩展委托,因此无法从属性类型推断出泛型类型。这可以通过将自定义 getter 和 setter 作为参数来克服:
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
}
}
Run Code Online (Sandbox Code Playgroud)
然后可以像这样使用:
private var upperCaseString: String by LateInit(setter = { field = it.toUpperCase() })
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2512 次 |
| 最近记录: |