Kotlin - "计算"var属性的用处?

Lov*_*vis 7 kotlin

我注意到,当我有一个var带有自定义的属性时get,不使用field标识符,无论如何都会生成一个支持字段.我检查了字节码,文档也这样说:

如果属性使用至少一个访问器的默认实现,或者自定义访问者通过字段标识符引用它,则将为该属性生成支持字段.
(重点是我的)

考虑这样的一个类.由于它是var属性,set因此将生成默认值(因此支持字段):

class Banana {
    var ripeness = 1

    var color: String = "green"
        get() = when {
            ripeness > 80 -> "brown"
            ripeness > 50 -> "yellow"
            else -> "green"
        }
}

val b = Banana()
b.color = "blue"

println(b.color)
Run Code Online (Sandbox Code Playgroud)

但是,println无论我设置什么,它都将始终打印为"绿色" color.无论如何,支持字段将设置为"蓝色".
由于无法在访问器方法之外(或通过反射)访问它,我真的想不出这个的原因.
我在这里错过了什么吗?也许是用例或其他方式访问支持领域?或者它只是一个错误(或IntelliJ中缺少警告)?

mfu*_*n26 13

A"计算出的" var属性与一个未使用的支持字段应该是一个"计算" val属性.

如果您不打算在示例中使用支持字段,则不Banana.color应该var只是a val.例如:

class Banana {
    var ripeness = 1

    val color: String
        get() = when {
            ripeness > 80 -> "brown"
            ripeness > 50 -> "yellow"
            else -> "green"
        }
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你真的想在某些情况下使你的"计算"属性可以覆盖,那么你需要实际使用支持字段.例如:

class Banana {
    var ripeness = 1

    var color: String = "green"
        get() = when {
            ripeness > 80 -> "brown"
            ripeness > 50 -> "yellow"
            else -> field
        }
}
Run Code Online (Sandbox Code Playgroud)