На этом шаге мы рассмотрим особенности задания и использования таких свойств.
Ранее мы сказали: когда вы объявляете свойство, всегда создается поле, которое хранит фактическое значение. Это, конечно, правда... Кроме случаев так называемых вычисляемых свойств. Вычисляемое свойство - это свойство, для которого переопределяется метод get() и/или set(), не использующий поле. В таких случаях Kotlin не генерирует поле.
В REPL создайте класс Dice (игральная кость) с вычисляемым свойством rolledValue.
class Dice() { val rolledValue get() = (1..6).shuffled().first() }
Рис.1. Объявление вычисляемого свойства (REPL)
Произведем бросок.
val myD6 = Dice()
myD6.rolledValue
res1: kotlin.Int = 1
myD6.rolledValue
res2: kotlin.Int = 5
myD6.rolledValue
res3: kotlin.Int = 6
Рис.2. Обращение к вычисляемому свойству (REPL)
При каждом обращении к свойству rolledValue его значение меняется. Это связано с тем, что оно вычисляется всякий раз, когда к нему обращаются. У него нет ни начального значения, ни значения по умолчанию, и у него нет поля, которое могло бы хранить значение.
Буквально через 2-3 шага, мы более подробно рассмотрим то, как реализованы свойства var и val и какой байт-код производится компилятором, когда вы определяете их.
Со следующего шага мы займемся рефакторингом NyetHack.