Scala и модель памяти Java

Модель памяти Java (начиная с версии 1.5) обрабатывает поля final по-разному полям не final. В частности, если ссылка this не исчезает во время построения, записи в final поля в конструкторе гарантируются, что они будут видны на других потоках, даже если объект становится доступным для другого потока через гонку данных. (Записывает поля не final, не гарантируется, что они видны, поэтому, если вы их неправильно публикуете, другой поток может видеть их в частично сконструированном состоянии.)

Есть ли какая-либо документация о том, как/если компилятор Scala создает final (а не не final) поля поддержки для классов? Я просмотрел спецификацию языка и искал в Интернете, но не могу найти окончательных ответов. (Для сравнения аннотация @scala.volatile документирована, чтобы пометить поле как volatile)

Ответы

Ответ 1

Я выкопал историю, чтобы узнать, когда было сделано изменение.

Проекция Scala в JVM не покрывается спецификацией языка.

Ответ 2

Он создает поле final, когда вы объявляете что-то как val. Все, чьи ссылки могут быть изменены, например, var, может (очевидно) не быть final снизу.

Это означает, что case classes содержит также конечные поля (поскольку аргументы конструктора класса case неявно val s)

Ответ 3

Я зарегистрировал ошибку в документации для этого в Scala ошибка.