Почему это выражение считается неизменным и поэтому может быть определено с помощью `val`? - PullRequest
1 голос
/ 24 марта 2019

В обучающем видео я увидел хороший, лаконичный «трюк» для демонстрации средств доступа, которые выглядели следующим образом:

val alive
    get() = health > 0

Это обеспечило хороший и простой способ обеспечить «геттер и сеттер» для всехв одном, где «установщик» на самом деле является просто производным значением.Я все это понимаю.

Но, думаю, я не вполне понимаю, что означает val, и, следовательно, означает "неизменный".Я представлял себе место в памяти, которое невозможно изменить.Это действительно то, что здесь происходит?Может быть, место в памяти фактически указывает на выражение, которое ожидает значение (здоровье), и поэтому оно, по сути, является неизменным.

1 Ответ

6 голосов
/ 24 марта 2019

Вам просто нужно думать о val как о только для чтения , а не неизменяемом .

Кроме того, обратите внимание, что вы не объявляете выражение как val, но свойство .

Объявление свойства val будет генерировать только свойство, а не установщик.В 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-эквиваленте, это даже не место в памяти (нет поля поддержки).Каждый раз, когда к свойству обращаются (внутренне используя сгенерированный метод получения), выражение «здоровье»> 0 вычисляется снова и может давать значение, отличное от предыдущего доступа к свойству.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...