125 votes

Collections immuables en Java

À partir de la version 1.6 de Java Cadre de Collecte de la documentation:

Les Collections qui ne prennent pas en charge toutes les opérations de modification (comme add, remove et clear) sont désignés comme inmodifiable. [...] Les Collections qui, en outre, de garantir qu'aucun changement de l'objet de Collection ne sera jamais visible sont désignés comme immuable.

Le deuxième critère me confond un peu. Compte tenu de la première collection est inmodifiable, et en supposant que l'original de la collection de référence a été disposé à l'écart, quels sont les changements qui sont mentionnés dans la deuxième ligne? Est-il en se référant à des changements dans les éléments de la tenue dans la collection c'est à dire l'état de ces éléments?

Deuxième question:
Pour une collection à être immuable, comment fait-on pour fournir les autres guarentees spécifié? Si l'état d'un élément de la collection est mise à jour par un fil, est-il suffisant pour l'immuabilité que ces mises à jour de l'état ne sont pas visibles sur le thread de la tenue de l'immuable collection?

Edit : (mise en surbrillance du focus de seconde question) :

Pour une collection à être immuable, comment fait-on pour fournir les autres guarentees spécifié?

167voto

Bozho Points 273663

Inmodifiable collections sont généralement en lecture seule vue (wrappers) d'autres collections. Vous ne pouvez pas ajouter, de supprimer ou de les désactiver, mais la collection sous-jacente peut changer.

Immuable collections ne peuvent pas être modifiées à tout - ils ne pas envelopper une autre collection - ils ont leurs propres éléments.

Voici une citation de goyave est ImmutableList

Contrairement aux Collections.unmodifiableList(java.util.List<? extends T>), ce qui est une vue d'une collecte séparée qui peut encore changer, une instance de ImmutableList contient ses propres données privées et ne changera jamais.

Donc, en gros, dans le but d'obtenir un immuable collection d'une mutable un, vous devez copier les éléments de la nouvelle collection, et de rejeter toutes les opérations.

92voto

Simon Nickerson Points 17147

La différence est que vous ne pouvez pas avoir de référence à une collection immuable qui permet des modifications. Les collections non modifiables ne sont pas modifiables via cette référence , mais un autre objet peut pointer vers les mêmes données via lesquelles elles peuvent être modifiées.

par exemple

 List<String> strings = new ArrayList<String>();
List<String> unmodifiable = Collections.unmodifiableList(strings);
unmodifiable.add("New string"); // will fail at runtime
strings.add("Aha!"); // will succeed
System.out.println(unmodifiable);
 

23voto

Joachim Sauer Points 133411
Collection<String> c1 = new ArrayList<String>();
c1.add("foo");
Collection<String> c2 = Collection.unmodifiableList(c1);

c1 est mutable (c'est à dire ni inmodifiable , ni immuable).
c2 est inmodifiable: il ne peut pas être changé lui-même, mais si plus tard je change c1 alors que le changement sera visible en c2.

C'est parce qu' c2 est tout simplement un wrapper autour de c1 et pas vraiment une copie indépendante. Goyave fournit l' ImmutableList interface et certaines implémentations. Ceux qui travaillent en fait la création d'une copie de l'entrée (sauf si l'entrée est immuable collection, sur son propre).

Concernant votre deuxième question:

La mutabilité/immutabilité d'un collectoin ne pas dépendre de la mutabilité/immutabilité des objets qui y sont contenues. La modification d'un objet contenu dans une collection à ne pas compter comme une "modification de la collection" pour cette description. Bien sûr, si vous avez besoin d'un immuable collection, vous avez généralement le voulez également contenir des objets immuables.

5voto

John B Points 17042

Je crois que le point ici est que, même si une collection est Inmodifiable, qui ne permet pas de garantir qu'il ne peut pas changer. Prenez par exemple une collection qui expulse les éléments s'ils sont trop vieux. Inmodifiable signifie simplement que l'objet de la tenue de la référence ne peut pas le changer, non pas qu'il ne peut pas changer. Un vrai exemple de ceci est l' Collections.unmodifiableList méthode. Elle renvoie un inmodifiable affichage d'une Liste. La Liste de référence qui a été adoptée cette méthode est toujours modifiable et donc, la liste peut être modifiée par tout détenteur de la référence qui a été adoptée. Cela peut entraîner ConcurrentModificationExceptions et d'autres mauvaises choses.

Immuable, dire que ne peut en aucune manière la collection être changé.

Deuxième question: est Immuable la collection ne signifie pas que les objets contenus dans la collection ne va pas changer, que cette collection ne sera pas de changement dans le nombre et la composition des objets qu'il détient. En d'autres termes, de la collection, liste des ouvrages de référence ne changera pas. Cela ne signifie pas que le fonctionnement interne de l'objet référencé ne peut pas changer.

Prograide.com

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.

Powered by:

X