septembre
2012
Quand on présente les Immutables de Guava, on présente aussi les Unmodifiables qui viennent avec le JDK. On dit à chaque fois que les immutables sont plus sures que les unmodifiables. Et voici pourquoi…
Partons d’une collection contenant les premiers nombres premiers :
1 | List premiers = new ArrayList(Arrays.asList(1, 2, 3, 5)); |
Pour avoir une liste Unmodifiable, il suffit de passer par Collections :
1 | List unmo = Collections.unmodifiableList(premiers); |
A partir de là, on ne peut pas modifier la liste en passant par la référence « unmo » qu’on vient de créer :
1 2 3 4 5 6 7 8 9 | @Test(expected = UnsupportedOperationException.class) public void testUnmodifiable1() { List premiers = new ArrayList(Arrays.asList(1, 2, 3, 5)); List unmo = Collections.unmodifiableList(premiers); unmo.add(7); } |
Quand on tente d’ajouter le chiffre « 7 » via la référence « unmo », on récolte une UOE (UnsupportedOperationException).
Par contre, rien n’empêche de modifier la liste initiale :
1 | premiers.add(7); |
Et là, aucune exception en vue. Mais le plus grave, c’est la suite :
1 2 3 4 5 6 7 8 9 10 11 12 13 | @Test public void testUnmodifiable2() { List premiers = new ArrayList(Arrays.asList(1, 2, 3, 5)); List unmo = Collections.unmodifiableList(premiers); System.out.println(premiers); System.out.println(unmo); premiers.add(7); System.out.println(premiers); System.out.println(unmo); } |
Ce qui donne la sortie :
1 2 3 4 | [1, 2, 3, 5] [1, 2, 3, 5] [1, 2, 3, 5, 7] [1, 2, 3, 5, 7] |
Ici on constate qu’une modification sur la liste de départ a affecté la liste unmodifiable.
A mon humble avis, lorsque les gens utilisent des unmodifiables de Java, ce dont ils ont vraiment envie, c’est l’équivalent des Immutables de Guava…
Complétons le test pour bien voir la différence :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @Test public void testUnmodifiableVsImmutables() { List premiers = new ArrayList(Arrays.asList(1, 2, 3, 5)); List unmo = Collections.unmodifiableList(premiers); List immu = ImmutableList.copyOf(premiers); System.out.println(premiers); System.out.println(unmo); System.out.println(immu); premiers.add(7); System.out.println(premiers); System.out.println(unmo); System.out.println(immu); } |
Ce qui donne la sortie suivante :
1 2 3 4 5 6 7 | [1, 2, 3, 5] [1, 2, 3, 5] [1, 2, 3, 5] [1, 2, 3, 5, 7] [1, 2, 3, 5, 7] [1, 2, 3, 5] |
Ici, la référence « immu » est vraiment immutable. C’est en fait une copie de la première liste.
Et voilà…
Commentaires récents
- Le Stop watch de Guava dans
- Le Stop watch de Guava dans
- Le Stop watch de Guava dans