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