我们可以在没有init值的情况下定义访问者吗?

时间:2016-01-08 06:20:20

标签: kotlin

我想为字段定义自己的访问器,如下所示:

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支持属性,以便我们可以自定义访问者,并使该字段保持未初始化状态。

1 个答案:

答案 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
    }

如果这不符合您的要求,请更新问题以澄清。