为什么将此表达式视为不可变的,并因此可以使用`val`进行定义?

时间:2019-03-24 18:38:37

标签: kotlin immutability accessor

在一个培训视频中,我看到了一个简洁明了的“技巧”,以演示访问器,如下所示:

val alive
    get() = health > 0

这提供了一种很好的,简单的方法来提供一个“ getter and setter”,其中“ setter”实际上只是一个衍生值。我了解所有这些。

但是我想我完全不理解val的含义,因此“不变”的含义。我在想象内存中的位置不可更改。这真的是这里发生的事吗?也许内存中的位置实际上指向期望值(健康)的表达式,因此实际上这是不可变的。

1 个答案:

答案 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,并且其生成的值可能不同于先前对该属性的访问。