Quelle est la différence entre les Collections.unmodifiableSet() et ImmutableSet de Goyave?
JavaDoc de ImmutableSet
dit:
Contrairement à
Collections.unmodifiableSet
, qui est une vue d'une collecte séparée qui peut encore changer, une instance de cette classe contient ses propres données privées et ne changera jamais. Cette classe est commode pour le public static final sets (constant"ensembles") et vous permet aussi de faire facilement sur la défensive "copie" d'un ensemble fourni à votre classe de l'appelant.
Mais la ImmutableSet
toujours des magasins de référence d'éléments, je ne pouvais pas comprendre la différence de Collections.unmodifiableSet()
. Exemple:
StringBuffer s=new StringBuffer("a");
ImmutableSet<StringBuffer> set= ImmutableSet.of(s);
s.append("b");//s is "ab", s is still changed here!
Quelqu'un pourrait-il expliquer?
Vous devez vous connecter pour publier un commentaire.
Considérez ceci:
En d'autres termes,
ImmutableSet
est immuable en dépit de collection, il est construit à partir de ce qui peut changer - parce qu'il crée une copie.Collections.unmodifiableSet
empêche la retourné collection d'être directement modifié, mais il est encore un point de vue sur un potentiellement changer la sauvegarde de jeu.Notez que si vous commencez à changer le contenu des objets visée par n'importe quel ensemble, tous les paris sont hors de toute façon. Ne pas le faire. En effet, c'est rarement une bonne idée de créer un ensemble à l'aide d'une mutable type d'élément dans la première place. (Idem cartes à l'aide d'une mutable type de clé.)
ImmutableSet.copyOf
- sinon, vous êtes en train de construire un ensemble de jeux de...En plus de la différence de comportement que Jon mentionne, une différence importante entre
ImmutableSet
et laSet
créé parCollections.unmodifiableSet
est queImmutableSet
est un type. Vous pouvez passer une autour de et de ont il reste clair que le jeu est immuable en utilisantImmutableSet
plutôt queSet
dans le code. AvecCollections.unmodifiableSet
, le type retourné est justeSet
... il n'est donc clair que le jeu est inmodifiable à l'endroit où il est créé, sauf si vous ajoutez Javadoc partout où vous passez queSet
en disant "ce jeu est inmodifiable".ImmutableSet
est unSet
, pas de conversion nécessaire.Kevin Bourrillion (Goyave lead developer) compare immuable /inmodifiable collections cette présentation. Alors que la présentation est de deux ans, et se concentre sur la "Google Collections" (qui est maintenant une sous-partie de Goyave), c'est un présentation très intéressante. L'API peut avoir changé ici et là (l'API Google Collections était en version Bêta à l'époque), mais les concepts de base de Google Collections /Goyave sont toujours valables.
Vous pourriez également être intéressé par cette autre DONC, la question ( Quelle est la différence entre google ImmutableList et des Collections.unmodifiableList() ).
Une différence entre les deux n'est pas noté dans d'autres réponses, c'est que
ImmutableSet
n'a pas permis denull
valeurs, comme décrit dans la Javadoc(La même restriction s'applique à valeurs dans tous les Goyave immuable collections.)
Par exemple:
Tous ces échouer au moment de l'exécution. En revanche:
C'est très bien.