Scala und das Java-Speichermodell
-
20-09-2019 - |
Frage
Das Java-Speichermodell (seit 1.5) behandelt final
Felder unterschiedlich auf Nicht-final
Felder aus. Insbesondere die this
Referenz zur Verfügung gestellt nicht entweicht während des Bau, schreibt zu final
Feldern im Konstruktor sind garantiert auf anderen Threads sichtbar sein, auch wenn das Objekt auf den anderen Thread über ein Daten Rennen zur Verfügung gestellt wird. (Writes zu nicht-final
Felder nicht sichtbar sein garantiert, so dass, wenn man sie nicht richtig veröffentlichen, ein anderer Thread sie in einem teilweise konstruierten Zustand sehen konnte.)
Gibt es eine Dokumentation, wie / ob die Scala-Compiler final
erzeugt (und nicht Nicht-final
) Sichern Felder für Klassen? Ich habe durch die Sprachspezifikation sehe und suchte im Internet aber keine definitiven Antworten finden. (Im Vergleich der @scala.volatile
Annotation is dokumentiert ein Feld als volatile
markieren)
Lösung
Ich grub durch die Geschichte um herauszufinden, wann die Änderung vorgenommen wurde.
- Bug Report Oktober 2007
- Commit November 2007
Die Projektion der Scala in die JVM ist nicht von der Sprache Spezifikation abgedeckt.
Andere Tipps
Es schafft ein final
Feld, wenn man etwas als val
erklären. Alles, was der Referenzen modifiziert werden kann, wie zum Beispiel eines var
kann (natürlich) nicht final
darunter sein.
Das bedeutet, dass case classes
letzte Felder enthalten auch (als Argument für einen Fall Klassenkonstruktors sind implizit val
s)
Ich habe eine Dokumentation Fehler für diesen in dem Scala Bug System abgelegt.