为什么我需要使用自定义getter初始化 var ,它返回一个常量?
var
var greeting: String // Property must be initialized get() = "hello"
当我将 greeting 设为只读( val )时,我不需要初始化
greeting
val
您的代码没有自定义setter,因此它相当于:
var greeting: String get() = "hello" set(v) {field = v} // Generated by default
set 的默认实现使用 field ,因此您必须初始化它 .
set
field
按照相同的逻辑,你不必初始化字段,如果你的 set 也没有 get 使用它(这意味着它们都是自定义的):
get
var greeting: String // no `field` associated! get() = "hello" set(v) = TODO()
这背后的原因是Backing field . 使用不使用字段标识符访问其值的自定义getter创建val时,不会生成支持字段 .
val greeting: String get() = "hello"
如果这样做,则生成后备字段并需要初始化 .
val greeting: String // Property must be initialized get() = field
现在用var . 由于默认情况下会生成支持字段,因此必须对其进行初始化 .
为了在没有初始化的情况下为var工作,您必须提供自定义setter以防止生成支持字段 . 例如:
var storage: String = "" var greeting: String get() = "hello" set(value) { storage = value}
2 回答
您的代码没有自定义setter,因此它相当于:
set
的默认实现使用field
,因此您必须初始化它 .按照相同的逻辑,你不必初始化字段,如果你的
set
也没有get
使用它(这意味着它们都是自定义的):这背后的原因是Backing field . 使用不使用字段标识符访问其值的自定义getter创建val时,不会生成支持字段 .
如果这样做,则生成后备字段并需要初始化 .
现在用var . 由于默认情况下会生成支持字段,因此必须对其进行初始化 .
为了在没有初始化的情况下为var工作,您必须提供自定义setter以防止生成支持字段 . 例如: