58 votes

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

Extrait de la javadocs de ImmutableList :

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

Est-ce que ça veut dire que :

  1. Si j'ai une liste immuable d'objets Dimension (par exemple), je ne peux pas modifier les objets Dimension qu'elle contient ?
  2. et si j'ai Collections.unmodifiableList (liste) d'objets Dimension, alors je ne peux pas seulement ajouter ou supprimer un objet mais je peux aussi les modifier (par exemple en appelant la méthode setDimension(width, height)) ?

1 votes

58voto

Yishai Points 42417

Non, l'immuabilité ne s'applique qu'à la quantité et aux références des objets dans le fichier Collection et n'aborde pas la question de la mutabilité des objets que vous placez dans l'espace de travail. Collection .

Ce que la liste immuable apporte par rapport au JDK standard Collections.unmodifiableList est qu'en utilisant ImmutableList vous avez la garantie que les objets référencés, leur ordre et la taille de la liste ne peuvent être modifiés par aucune 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 véritable immuabilité, vous devez remplir la liste avec des objets immuables.

0 votes

@Vuntic, si la classe est vraiment immuable, ses champs sont déclarés finaux, et la réflexion ne peut pas changer cela.

4 votes

@Yishai, réflexion peut modifier les champs finaux. Essayez-le.

0 votes

@Vuntic, avec setAccessible ? Cela dépend du gestionnaire de sécurité ;).

19voto

z5h Points 8029

Utilisation de Collections.unmodifiableList crée une enveloppe autour de votre liste. Si la liste sous-jacente change, la vue de votre liste non modifiable change aussi.

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

Ni l'un ni l'autre ne vous empêchera de modifier un objet dans une liste, ou ses champs, ou les champs des champs, etc.

2 votes

"Comme le dit la documentation, le code de Google crée une copie." C'est pourrait créer une copie. Si l'original est également une structure de données immuable, il pourrait en fait être en mesure de la réutiliser. Ainsi, si vous utilisez ImmutableList Dans une large mesure, vous rencontrerez ce cas très souvent et vous finirez par ne pas avoir à copier beaucoup.

7voto

KitsuneYMG Points 7604

ImmutableList est similaire à Collections.unmodifiableList( new ArrayList( list ) ) . Notez que la nouvelle ArrayList est pas assigné à un champ ou à une variable.

3voto

BobMcGee Points 6721
  1. Non, les objets individuels contenus peuvent encore être modifiés. Une collection ne fait que stocker références aux objets contenus, et non une copie complète de chaque objet.
  2. Vous pouvez modifier la liste en modifiant la collection parent sur laquelle vous avez appelé Collections.unmodifiableList(list). Mais oui, vous pouvez utiliser setDimension pour modifier un élément de liste stocké.

0voto

Bartek Points 120

Vous pouvez également jeter un coup d'œil à cette question (Quelle est la différence entre Collections.unmodifiableSet() et ImmutableSet de la goyave).

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