DZone den Titel refcard „Core Java Concurrency“ heißt es:Java: Endgültiges Feld Einfrieren Objekt erreichbar von endgültigen Feldern
Einmal eingestellt, letzter Feldwert nicht geändert werden kann. Wenn Sie ein Objektverweisfeld als endgültig markieren, verhindert das nicht, dass Objekte, die von diesem Feld referenziert werden, später geändert werden. Für Beispiel kann ein abschließendes ArrayList-Feld nicht in eine andere ArrayList geändert werden, aber Objekte können in der Listeninstanz hinzugefügt oder entfernt werden.
und
Schluss Feld Einfrieren umfasst nicht nur die letzten Felder im Objekt, sondern auch alle Objekte erreichbar von diesen letzten Felder aus.
Ich bin nicht ganz klar über die zweite Aussage. Bedeutet das, dass, wenn ich ein letztes Feld in Klasse A vom Typ Klasse B habe, die wiederum ein Endfeld vom Typ Integer haben, dann wird das endgültige Einfrieren eines Feldes für eine Instanz der Klasse A erst nach dem letzten Einfrieren des Feldes für b.c
abgeschlossen passiert?
Dank Alex für die detaillierte Antwort. Sehr geschätzt. Übrigens, ich mochte die Refcard auch sehr. –
>> ... letzte Einfrieren in diesem Fall bedeutet, dass wenn Sie eine Instanz von A erstellen und sicher veröffentlichen, andere Objekte nie einen nicht initialisierten Wert für b oder c sehen << - nein, tatsächlich "sicher veröffentlichen" ist nicht hier erforderlich. Die einzige Anforderung: 'Dies' darf nicht aus dem Konstruktor entkommen – Male
@Alex Miller "Final field freeze" ist ein offizieller Begriff? – nish1013