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()