Kotlin:为什么我需要用自定义getter来初始化一个var?

为什么我需要用自定义getter来初始化一个var ,返回一个常量?

 var greeting: String // Property must be initialized get() = "hello" 

当我使greeting只读( val )时,我不需要初始化

背后的原因是背后的领域 。 当您使用不使用字段标识符来访问其值的自定义getter创建val时,则不会生成后备字段。

 val greeting: String get() = "hello" 

如果你这样做,则生成后台字段并需要初始化。

 val greeting: String // Property must be initialized get() = field 

现在与var。 由于支持字段默认生成,所以必须进行初始化。

 var greeting: String // Property must be initialized get() = "hello" 

为了在没有初始化的情况下为var工作,您必须提供一个自定义setter来防止生成后台字段。 例如:

 var storage: String = "" var greeting: String get() = "hello" set(value) { storage = value} 

你的代码没有自定义的setter,所以它相当于:

 var greeting: String get() = "hello" set(v) {field = v} // Generated by default 

set的默认实现使用field ,所以你必须初始化它。

通过同样的逻辑,你不必先初始化这个域,也不用去使用它(这意味着它们都是自定义的):

 var greeting: String // no `field` associated! get() = "hello" set(v) = TODO()