我注意到,当我有一个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)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2750 次  |  
        
|   最近记录:  |