首页 文章

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

提问于
浏览
14

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

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

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

2 回答

  • 8

    您的代码没有自定义setter,因此它相当于:

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

    这背后的原因是Backing field . 使用不使用字段标识符访问其值的自定义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}
    

相关问题