Модель памяти Java (начиная с 1.5) обработки final
поля по-другому к не -final
поля. В частности, обеспечил this
ссылка не выходит во время конструкции, пишет в final
поля в конструкторе, как гарантируют, будут видимы на других потоках, даже если объект будет сделан доступным для другого потока через гонку данных. (Записи к не -final
поля, как гарантируют, не будут видимы, поэтому при неподходящей публикации их другой поток видел их в частично созданном состоянии.)
Есть ли любая документация относительно того, как/если компилятор Scala создает final
(а не не -final
) поддержка полей для классов? Я просмотрел спецификацию языка и искал сеть, но не могу найти категорические ответы. (В сравнении @scala.volatile
аннотация документируется для маркировки поля как volatile
)
Я покопался в истории, чтобы узнать, когда было внесено изменение.
Проекция Scala в JVM не покрывается спецификацией языка.
Он создает поле final
, когда вы объявляете что-то как val
. Все, чьи ссылки могут быть изменены, например, var
, не может (очевидно) быть окончательным
ниже.
Это означает, что классы case
также содержат конечные поля (поскольку аргументы конструктора класса case неявно val
s)
Я зарегистрировал ошибку документации для этого в системе Scala bug .