Immutable ArrayList in Java

1. Panoramica

Questo breve tutorial mostrerà come rendere immutabile un ArrayList con il JDK di base, con Guava e infine con Apache Commons Collections 4.

Questo articolo fa parte della serie " Java - Back to Basic " qui su Baeldung.

2. Con JDK

Innanzitutto, il JDK fornisce un bel modo per ottenere una raccolta non modificabile da una esistente:

Collections.unmodifiableList(list);

La nuova collezione non dovrebbe più essere modificabile a questo punto:

@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. Con Java 9

A partire da Java 9, possiamo utilizzare un metodo factory statico List.of (E… elements) per creare un elenco immutabile:

@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"); }

Notare come dobbiamo convertire l' elenco esistente in un array. Questo perché List.of (elementi) accetta parametri vararg.

3. Con Guava

Guava fornisce funzionalità simili per creare la propria versione di ImmutableList :

ImmutableList.copyOf(list);

Allo stesso modo, l'elenco risultante non dovrebbe essere modificabile:

@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"); }

Nota che questa operazione creerà effettivamente una copia dell'elenco originale , non solo una visualizzazione.

Guava fornisce anche un builder: questo restituirà ImmutableList di tipo forte anziché semplicemente 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. Con le collezioni Apache Commons

Infine, Commons Collection fornisce anche un'API per creare un elenco non modificabile:

ListUtils.unmodifiableList(list);

E ancora, la modifica dell'elenco risultante dovrebbe comportare un'eccezione 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. conclusione

Questo tutorial illustra come creare facilmente un elenco non modificabile da un ArrayList esistente utilizzando le raccolte JDK di base, Google Guava o Apache Commons.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata su Github : questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.