在一个培训视频中,我看到了一个简洁明了的“技巧”,以演示访问器,如下所示:
val alive
get() = health > 0
这提供了一种很好的,简单的方法来提供一个“ getter and setter”,其中“ setter”实际上只是一个衍生值。我了解所有这些。
但是我想我完全不理解val
的含义,因此“不变”的含义。我在想象内存中的位置不可更改。这真的是这里发生的事吗?也许内存中的位置实际上指向期望值(健康)的表达式,因此实际上这是不可变的。
答案 0 :(得分:6)
您只需要将val
视为只读,而不是不可变。
另外,请注意,您并不是将表达式声明为val
,而是将属性声明为。
声明val
属性只会为该属性生成一个getter,而不是一个setter。在Java中,您可能已经编写了相同的“计算获取器”(没有背景字段,也没有设置器):
public class Player {
private int health = 100;
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public boolean isAlive() {
return health > 0;
}
}
我在想象内存中的位置是不变的。
正如您在上面的Java等效语言中所看到的,它甚至不是内存中的位置(没有后备字段)。每次访问该属性时(内部使用生成的getter进行访问),都会再次评估表达式health> 0,并且其生成的值可能不同于先前对该属性的访问。