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

时间:2017-01-03 09:56:45

标签: kotlin

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

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

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

2 个答案:

答案 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,因此您必须对其进行初始化。

按照相同的逻辑,如果您的setget使用它(这意味着它们都是自定义的),您不必初始化字段:

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