为什么这个表达式被认为是不可变的,因此可以使用“val”来定义?

Why is this expression considered immutable, and therefore can be defined using `val`?

在培训视频中,我看到一个漂亮、简洁的 "trick" 来演示访问器,看起来像这样:

val alive
    get() = health > 0

这提供了一种很好、简单的方法来提供一个 "getter and setter",其中 "setter" 实际上只是一个派生值。我明白了。

但我想我不太理解val的意思,因此"immutable"的意思。我在想象内存中一个不可更改的位置。这真的是这里发生的事情吗?也许内存中的位置实际上指向一个期望值(健康)的表达式,因此这实际上是不可变的。

您只需要将 val 视为 只读 而不是 不可变

此外,请注意,您不是将 表达式 声明为 val,而是将 属性.

声明 val 属性 只会为 属性 生成 getter,而不是 setter。在 Java 中,您可以编写相同的 "computed getter"(没有支持字段,也没有 setter):

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;
    }
}

I was imagining a location in memory that was unchangeable.

正如您在上面的 Java 等效项中所见,它甚至不是内存中的一个位置(没有支持字段)。每次访问 属性 时(在内部使用生成的 getter),表达式 health > 0 都会被再次计算,并且可能产生与之前访问 属性 不同的值。