In Java, quando si utilizza un oggetto su più thread (e in generale), è buona pratica rendere i campi definitivi. Ad esempio,Scala finale vs val per visibilità concorrenza
public class ShareMe {
private final MyObject obj;
public ShareMe(MyObject obj) {
this.obj = obj;
}
}
In questo caso, la visibilità di obj sarà coerente su più thread (supponiamo obj ha tutti i campi finali pure) in quanto è costruito in modo sicuro utilizzando la parola chiave finale.
In scala, non viene visualizzato il valore di val in un riferimento finale, ma piuttosto val è la semantica in scala che impedisce di riassegnare una variabile (Scala final variables in constructor). Se le variabili del costruttore di scala non sono definite come definitive, soffriranno dello stesso problema (quando si usano questi oggetti negli attori)?
grazie per questo chiarimento. Riesci a vedere il mio aggiornamento a questa domanda? Sto anche vedendo le variabili del costruttore dichiarate come finali (come mostrato in javap) per una classe non case senza alcun modificatore. –
@retronym, sono giunto alla tua risposta cercando di trovare una risposta alla mia domanda, [Immutability e thread-safety in Scala] (http://stackoverflow.com/questions/32113124/immutability-and-thread-safety-in- Scala). Come sapete, la parola chiave 'final' in Java viene utilizzata anche per evitare il trasferimento delle istruzioni del ctor, come indicato in [questo] (https://www.cs.umd.edu/~pugh/java/memoryModel /jsr-133-faq.html#finalRight) link. Quindi, se ho capito bene la tua risposta, usare un campo 'val' in una classe di Scala equivale a dichiarare un campo' finale' in una classe Java, lasciando che il JMM funzioni correttamente? –