初始化有getter和setter的字段?

我在Kotlin创建了一个有示例字段的类

class SomeClass { var smth: String = "Initial value" get() = "Here it is" set(value) { field = "it is $value" } } 

当我创建一个类的对象并调用smth字段时,它将会调用get()属性。

  val myValue = SomeClass().smth// myValue = "Here it is" 

所以,问题是:为什么我们必须初始化一个有getter的字段?

  var smth: String // Why this gives error? get() = "Here it is" set(value) { field = "it is $value" } 

它将始终从get()属性返回值,不是吗?

我只是认为这是因为编译器不够聪明,推断它不是null。

其实一个非常类似的代码从这里的官方文档https://kotlinlang.org/docs/reference/properties.html

 var stringRepresentation: String get() = this.toString() set(value) { setDataFromString(value) // parses the string and assigns values to other properties } 

显然这个代码不会编译,除非像一个构造函数

 constructor(stringRepresentation: String) { this.stringRepresentation = stringRepresentation } 

被添加。

你在setter中有后台字段,所以我们应该初始化,看这个参考