Kotlin – “计算”var属性的有用性?

我注意到,当我有一个自定义get var属性,不使用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) 

然而, println总是会打印“绿色”,无论我设置什么color 。 反正领域将被设置为“蓝色”。
由于无法在访问器方法之外访问它(或通过反射),所以我真的无法想到这个原因。
我在这里错过了什么? 也许一个用例或其他方式访问后台? 还是只是一个错误(或在IntelliJ缺少警告)?

使用后台字段的“计算” var属性应该是“计算” val属性。

如果你不打算在你的例子中使用后台字段,那么Banana.color应该不是一个Banana.color而是一个val 。 例如:

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

另一方面,如果你真的想在某些情况下使你的“计算”属性重写,那么你将需要实际使用后台字段。 例如:

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