假设我正在 Kotlin 中处理以下代码:
class Human(var head: Head, var body: Body, var legs: Legs) {
var height = this.head.length + this.body.length + this.legs.length
}
class Head(var length: Int) { }
class Body(var length: Int) { }
class Legs(var length: Int) { }
为什么初始化时Human.height -> x
返回正确的高度,但如果对各个部分进行更改,则不会更新?我使用这些子类的格式是否正确?我已经找到了一些关于正确使用子类的文档,但我还没有找到与我的用例相匹配的结构。提前感谢!
您的高度变量有一个支持字段,该字段将初始化为=
符号后面的值。当您获取它时,它不会重新计算。所以这个 Kotlin 代码将等效于以下 Java 代码:
// Kotlin
var height = this.head.length + this.body.length + this.legs.length
// Java
// The backing field
private int height = this.head.length + this.body.length + this.legs.length
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
您真正想要的是每次调用get
-方法时重新计算值。由于您不想实际写入任何height
字段,因此您可以使用val
而不是var
。喜欢这个:
// Kotlin
val height: Int
get() = this.head.length + this.body.length + this.legs.length
// Which is equivalent to this Java code:
public int getHeight() {
return this.head.length + this.body.length + this.legs.length;
}
如您所见,支持字段将消失,因为每次都会重新计算该值。也没有二传手,因为我们现在使用的是val
。
你不是在实现一个getter,你只是在初始化Human
时计算并分配height
值。
您正在寻找的是 getter 实现:
class Human(var head: Head, var body: Body, var legs: Legs) {
val height
get() = this.head.length + this.body.length + this.legs.length
}