ArrayList immuable en Java

1. Vue d'ensemble

Ce tutoriel rapide montrera comment rendre une ArrayList immuable avec le JDK principal, avec Guava et enfin avec Apache Commons Collections 4.

Cet article fait partie de la série « Java - Back to Basic » ici sur Baeldung.

2. Avec le JDK

Tout d'abord, le JDK offre un moyen agréable d'extraire une collection non modifiable d'une collection existante:

Collections.unmodifiableList(list);

La nouvelle collection ne devrait plus être modifiable à ce stade:

@Test(expected = UnsupportedOperationException.class) public void givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable() { List list = new ArrayList(Arrays.asList("one", "two", "three")); List unmodifiableList = Collections.unmodifiableList(list); unmodifiableList.add("four"); }

2.1. Avec Java 9

Depuis Java 9, nous pouvons utiliser une méthode de fabrique statique List.of (E… elements) pour créer une liste immuable:

@Test(expected = UnsupportedOperationException.class) public final void givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable() { final List list = new ArrayList(Arrays.asList("one", "two", "three")); final List unmodifiableList = List.of(list.toArray(new String[]{})); unmodifiableList.add("four"); }

Remarquez comment nous devons convertir la liste existante en un tableau. C'est parce que List.of (elements) accepte les paramètres vararg.

3. Avec goyave

Guava fournit des fonctionnalités similaires pour créer sa propre version d' ImmutableList :

ImmutableList.copyOf(list);

De même - la liste résultante ne doit pas être modifiable:

@Test(expected = UnsupportedOperationException.class) public void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() { List list = new ArrayList(Arrays.asList("one", "two", "three")); List unmodifiableList = ImmutableList.copyOf(list); unmodifiableList.add("four"); }

Notez que cette opération créera en fait une copie de la liste d'origine , pas seulement une vue.

Guava fournit également un constructeur - cela renverra la ImmutableList de type fort au lieu de simplement List :

@Test(expected = UnsupportedOperationException.class) public void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() { List list = new ArrayList(Arrays.asList("one", "two", "three")); ImmutableList unmodifiableList = ImmutableList.builder().addAll(list).build(); unmodifiableList.add("four"); }

4. Avec Apache Collections Commons

Enfin, Commons Collection fournit également une API pour créer une liste non modifiable:

ListUtils.unmodifiableList(list);

Et encore une fois, la modification de la liste résultante devrait entraîner une exception UnsupportedOperationException :

@Test(expected = UnsupportedOperationException.class) public void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable() { List list = new ArrayList(Arrays.asList("one", "two", "three")); List unmodifiableList = ListUtils.unmodifiableList(list); unmodifiableList.add("four"); }

5. Conclusion

Ce didacticiel montre comment créer facilement une liste non modifiable à partir d'une ArrayList existante à l' aide des collections JDK, Google Guava ou Apache Commons.

L'implémentation de tous ces exemples et extraits de code peut être trouvée sur Github - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.