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)

War es hilfreich?

Lösung

Ich grub durch die Geschichte um herauszufinden, wann die Änderung vorgenommen wurde.

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 vals)

Ich habe eine Dokumentation Fehler für diesen in dem Scala Bug System abgelegt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top