DZone refcard intitulé "Core Java Concurrency" déclare:Java: gel de champ final sur l'objet accessible à partir de champs final
Une fois défini, les valeurs de champ finale ne peut pas être changé. Marquer un champ de référence d'objet comme final ne pas empêcher les objets référencés de ce champ de changer plus tard. Pour l'exemple , un champ ArrayList final ne peut pas être modifié en un objet ArrayList différent, mais des objets peuvent être ajoutés ou supprimés dans l'instance de liste.
et
gel final sur le terrain ne comprend pas seulement les champs final de l'objet, mais aussi tous les objets accessible à partir de ces champs finaux.
Je ne suis pas entièrement clair sur la deuxième déclaration. Cela signifie-t-il que si j'ai un champ final dans la classe A de type B, qui possède à son tour un champ final de type Integer, alors le gel définitif du champ pour une instance de classe A se termine seulement après le gel final du champ b.c
arrivé?
public class A{
public final B b = new B();
}
public class B{
public final Integer c = 10;
}
Merci Alex pour la réponse détaillée. Vraiment apprécié. BTW J'ai vraiment aimé la Refcard aussi. –
>> ... le gel définitif des champs dans ce cas signifie que lorsque vous créez une instance de A et la publiez en toute sécurité, les autres objets ne verront jamais une valeur non initialisée pour b ou c << - non, Requaired ici. La seule exigence: 'ceci' ne doit pas échapper au constructeur – Male
@Alex Miller "Final field freeze" est un terme officiel? – nish1013