Doit des objets immuables ont toutes les propriétés de l'être final
?
Selon moi pas. Mais je ne sais pas, si je suis de droite.
Doit des objets immuables ont toutes les propriétés de l'être final
?
Selon moi pas. Mais je ne sais pas, si je suis de droite.
La principale différence entre un objet immuable (toutes les propriétés finales) et, effectivement, une immuable objet (propriétés ne sont pas définitives, mais ne peut pas être changé) est sûr de publication.
Vous pouvez publier un immuable objet dans un contexte multithread sans avoir à vous soucier de l'ajout de la synchronisation, grâce aux garanties prévues par la Java de la Mémoire de Modèle pour la finale de champs:
finale des domaines aussi permettre aux programmeurs de mettre en œuvre thread-safe des objets immuables, sans synchronisation. Un thread-safe immuable objet est considéré comme immuable par tous les threads, même si une course est utilisé pour transmettre des références à l'immuable objet entre les threads. Cela peut fournir des garanties de sécurité contre l'utilisation abusive de immuable de classe en raison d'une erreur ou d'un code malveillant. final champs doivent être utilisées correctement pour fournir une garantie de l'immuabilité.
Comme une note de côté, il permet aussi d'appliquer l'immutabilité (si vous essayez de muter ces champs dans une future version de votre classe parce que vous avez oublié, il devrait être immuable, il ne compile pas).
Précisions
final List
, pas de mutation des opérations (ajout, suppression...) doit être effectué après la construction) et (ii) vous ne laissez pas l' this
s'échapper pendant la constructionExemple de dangereux publication:
class EffectivelyImmutable {
static EffectivelyImmutable unsafe;
private int i;
public EffectivelyImmutable (int i) { this.i = i; }
public int get() { return i; }
}
// in some thread
EffectivelyImmutable.unsafe = new EffectivelyImmutable(1);
//in some other thread
if (EffectivelyImmutable.unsafe != null
&& EffectivelyImmutable.unsafe.get() != 1)
System.out.println("What???");
Ce programme pourrait, en théorie, imprimer What???
. Si i
étaient final, ce ne serait pas un résultat juridique.
Vous pouvez facilement garantir l'immuabilité par encapsulation, de sorte qu'il n'est pas nécessaire:
// This is trivially immutable.
public class Foo {
private String bar;
public Foo(String bar) {
this.bar = bar;
}
public String getBar() {
return bar;
}
}
Cependant, vous devez garantir par encapsulation dans certains cas, il n'est donc pas suffisant:
public class Womble {
private final List<String> cabbages;
public Womble(List<String> cabbages) {
this.cabbages = cabbages;
}
public List<String> getCabbages() {
return cabbages;
}
}
// ...
Womble w = new Womble(...);
// This might count as mutation in your design. (Or it might not.)
w.getCabbages().add("cabbage");
Ce n'est pas une mauvaise idée de le faire pour attraper quelques erreurs triviales, et de démontrer votre intention clairement, mais "tous les champs sont définitives" et "la classe est immuable" ne sont pas des états équivalents.
Immuable = non modifiables. Afin d'apporter des propriétés final est une bonne idée. Si pas toutes les propriétés d'un objet sont protégés d'être changé, je ne dirais pas que l'objet est immuable.
MAIS d'un objet est aussi immuable que si elle ne fournit pas toutes les setters pour les propriétés privées.
Des objets immuables ne DOIVENT pas être modifiés après leur création. finale de cours aide à obtenir. - Vous garantir qu'ils ne seront pas jamais être changé. MAIS que faire si vous avez un tableau à l'intérieur de votre objet, qui est définitive? Bien sûr, la référence n'est pas changable, mais les éléments sont. Regardez ici, presque à la même question, j'ai donné aussi:
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.