Внутри класса определение val
декомпилируется в метод "getter", который ссылается на скрытое поле класса.Эти методы «получения» могут быть самоссылочными (или, скорее, инициализатор класса может ссылаться на «получение»), потому что это семантика методов Java.Обратите внимание, что ваше "внешнее" определение val s
фактически обернуто в скрытый класс с помощью REPL (именно так REPL обходит ограничение, запрещающее объявлять val
на верхнем уровне).
Внутри метода определение val
не декомпилируется в метод "getter", а скорее в байт-код, необходимый для генерации значения в стеке.A lazy val
, с другой стороны, всегда требует метода "getter", который, как таковой, может быть самоссылочным.