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