我想为字段定义自己的访问器,如下所示:
var item: Item
get() {...}
set(value) {...}
我收到错误,因为项目未初始化。我无法添加lateinit因为我定义了get和set方法。
我可以选择的是声明另一个可以为空的字段,并使用该字段来实现项目访问器,这太愚蠢和冗余。
所以我想还有其他方法可以实现这个要求......
更新
谢谢你的回复。 我想我没有说清楚。在我多次阅读文档后,我认为答案是否定的。
我的要求是:是否有更简单的替代方式来声明这个?
private var _table: Map<String, Int>? = null
public val table: Map<String, Int>
get() {
if (_table == null)
_table = HashMap() // Type parameters are inferred
return _table ?: throw AssertionError("Set to null by another thread")
}
我们必须声明一个nullabe支持属性,以便我们可以自定义访问者,并使该字段保持未初始化状态。
答案 0 :(得分:4)
如果声明具有支持字段的属性,则需要对其进行初始化。如果您不想初始化它,您可以声明自定义getter和setter。
var item: String
get() = "my String"
set(value) {
log(value)
//do something with value
}
如果您没有初始化属性的值,请将其声明为可为空并使用null
初始化
var item: String? = null
get() = field
set(value) {
field = value
//do something with value
}
如果这不符合您的要求,请更新问题以澄清。