我注意到,当我有一个带有自定义 get
的 var
属性时,它不使用 field
标识符,支持字段是无论如何生成。我检查了字节码,文档也这么说:
A backing field will be generated for a property if it uses the default implementation of at least one of the accessors, or if a custom accessor references it through the field identifier.
(emphasis is mine)
考虑这样的类(class)。由于它是一个 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)
但是,无论我将 color
设置为什么,println
都会始终打印“绿色”。无论如何,支持字段将设置为“蓝色”。
由于无法在访问器方法之外(或通过反射)访问它,我真的想不出原因。
我在这里错过了什么吗?也许是一个用例或其他访问支持字段的方式?还是只是一个错误(或 IntelliJ 中缺少警告)?
最佳答案
具有未使用的支持字段的“计算”var
属性应该是“计算”val
属性.
如果您不打算在示例中使用支持字段,那么 Banana.color
不应该是 var
而是 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
}
}
关于Kotlin - "computed"var 属性的用处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41279312/