Immutable ArrayList en Java

Immutable ArrayList en Java

1. Vue d'ensemble

Ce tutoriel rapide montrerahow to make an ArrayList immutable avec le noyau JDK, avec Guava et enfin avec Apache Commons Collections 4.

Cet article fait partie dethe “Java – Back to Basic” series ici par exemple.

Lectures complémentaires:

Recueillir un flux Java dans une collection immuable

Apprenez à collecter des flux Java en collections immuables.

Read more

Introduction aux Immutables

Une introduction rapide et pratique à la bibliothèque Immutables - utilisée pour générer des objets immuables via des annotations.

Read more

Java - Obtenir un élément / élément aléatoire d'une liste

Un guide rapide et pratique pour choisir un ou plusieurs éléments au hasard dans une liste en Java.

Read more

2. Avec le JDK

Premièrement, le JDK offre un moyen intéressant 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");
}

3. Avec goyave

Guava fournit des fonctionnalités similaires pour créer sa propre version deImmutableList:

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 sera en faitcreate a copy of the original list, pas seulement une vue.

Guava fournit également un générateur - cela retournera lesImmutableList de type fort au lieu de simplementList:

@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 unUnsupportedOperationException:

@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 utiliser facilement lescreate an unmodifiable List out of an existing ArrayList en utilisant le noyau JDK, Google Guava ou Apache Commons Collections.

L'implémentation de tous ces exemples et extraits de codecan be found over on Github - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.