web-dev-qa-db-fra.com

Quelle est la différence entre ImmutableList de Google et Collections.unmodifiableList ()?

Depuis les javadocs ImmutableList:

Contrairement à Collections.unmodifiableList (Java.util.List), qui est une vue d'un séparé collection qui peut encore changer, un instance de ImmutableList contient son posséder des données privées et ne sera jamais changement. ImmutableList est pratique pour les listes finales statiques publiques ("listes constantes") et vous permet également faire facilement une "copie défensive" d'un liste fournie à votre classe par un votre interlocuteur.

Est-ce que cela signifie que: 

  1. si j'ai des objets ImmutableList of Dimension (par exemple), alors je ne peux en changer aucun?
  2. et si j'ai Collections.unmodifiableList (liste) d'objets Dimension, je ne peux pas seulement ajouter ou supprimer un objet, mais je peux également le modifier (par exemple, appeler la méthode setDimension (width, height))?
48
Roman

Non, l’immuabilité ne s’applique qu’à la quantité et aux références des objets de la collection et ne traite pas de la mutabilité des objets que vous avez placés dans la collection.

Ce que la liste Immutable gagne par rapport au JDK Collections.unmodifiableList standard, c’est qu’en utilisant ImmutableList, vous êtes assuré que les objets référencés, leur ordre et la taille de la liste ne peuvent pas changer de source. Avec Collections.unmodifiableList, si quelque chose d'autre a une référence à la liste sous-jacente, ce code peut modifier la liste même si vous avez une référence à une liste non modifiable.

Si, toutefois, vous voulez une vraie immuabilité, vous devez remplir la liste avec des objets immuables.

53
Yishai

Utiliser Collections.unmodifiableList crée une enveloppe autour de votre liste. si la liste sous-jacente change, la vue de votre liste non modifiable change également.

Comme le dit la documentation, le code de Google crée une copie. C'est un calcul plus coûteux qui consomme plus de mémoire, mais si quelqu'un modifie la liste d'origine, cela n'affectera pas ImmutableList.

Aucune de ces méthodes ne vous empêchera de modifier un objet dans une liste, ses champs, ses champs, etc.

17
z5h

ImmutableList est similaire à Collections.unmodifiableList( new ArrayList( list ) ). Notez que la ArrayList nouvellement créée est non assignée à un champ ou une variable.

6
KitsuneYMG
  1. Non, les objets individuels contenus peuvent toujours être modifiés. En réalité, une collection ne fait que stocker références des objets contenus, et non une copie complète de chaque objet.
  2. Vous pouvez modifier la liste en modifiant la collection parente sur laquelle vous avez appelé Collections.unmodifiableList (liste). Mais oui, vous POUVEZ utiliser setDimension pour modifier un élément de la liste stockée. 
3
BobMcGee

Vous voudrez peut-être aussi regarder cette question (Quelle est la différence entre Collections.unmodifiableSet() et ImmutableSet de Goyave).

0
Bartek