Java メモリ モデル (1.5 以降) は、フィールドfinal
を非final
フィールドとは異なる方法で扱います。特に、this
構築中に参照がエスケープされない限りfinal
、コンストラクターのフィールドへの書き込みは、オブジェクトがデータ競合を介して他のスレッドで使用可能になった場合でも、他のスレッドで可視であることが保証されます。(非フィールドへの書き込みfinal
は表示されるとは限らないため、それらを不適切に公開すると、別のスレッドがそれらを部分的に構築された状態で見る可能性があります。)
Scalaコンパイラがクラスのバッキングフィールドをfinal
(非ではなく)作成する方法/場合に関するドキュメントはありますか? final
言語仕様に目を通し、Web を検索しましたが、決定的な答えが見つかりません。(比較すると、@scala.volatile
注釈はフィールドを としてマークするように文書化されていますvolatile
)