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

Mik*_*son 1 accessor immutability kotlin

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

val alive
    get() = health > 0
Run Code Online (Sandbox Code Playgroud)

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

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

Jof*_*rey 6

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

另外,请注意,您并不是将表达式声明为val,而是将其声明为property

声明一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在想象内存中的位置不可更改。

如您在上面的Java等效物中所看到的,它甚至不在内存中(没有备用字段)中。每次访问该属性时(内部使用生成的getter进行访问),都会再次评估运行状况> 0的表达式,并且该值可能会与之前对该属性的访问产生不同的值。