14

Java メモリ モデル (1.5 以降) は、フィールドfinalを非finalフィールドとは異なる方法で扱います。特に、this構築中に参照がエスケープされない限りfinal、コンストラクターのフィールドへの書き込みは、オブジェクトがデータ競合を介して他のスレッドで使用可能になった場合でも、他のスレッドで可視であることが保証されます。(非フィールドへの書き込みfinalは表示されるとは限らないため、それらを不適切に公開すると、別のスレッドがそれらを部分的に構築された状態で見る可能性があります。)

Scalaコンパイラがクラスのバッキングフィールドをfinal(非ではなく)作成する方法/場合に関するドキュメントはありますか? final言語仕様に目を通し、Web を検索しましたが、決定的な答えが見つかりません。(比較すると、@scala.volatile注釈フィールドを としてマークするように文書化されていますvolatile)

4

3 に答える 3

5

変更がいつ行われたかを知るために、歴史を掘り下げました。

JVM への Scala のプロジェクションは、言語仕様でカバーされていません。

于 2010-03-17T13:47:34.800 に答える
3

final何かをとして宣言すると、フィールドが作成されますval。、など、参照を変更できるものはすべて、var(明らかに)final下に置くことはできません。

これは、case classesfinalフィールドも含むことを意味します(ケースクラスコンストラクターへの引数は暗黙的にvalsであるため)

于 2010-03-17T12:59:07.280 に答える
2

これについては、Scala バグシステムにドキュメンテーション バグを提出しました。

于 2010-03-28T17:48:15.067 に答える