Unveränderliche ArrayList in Java

1. Übersicht

Dieses kurze Tutorial zeigt, wie Sie eine ArrayList mit dem Kern-JDK, mit Guava und schließlich mit Apache Commons Collections 4 unveränderlich machen .

Dieser Artikel ist Teil der Reihe „ Java - Back to Basic “ hier auf Baeldung.

2. Mit dem JDK

Erstens bietet das JDK eine gute Möglichkeit, eine nicht veränderbare Sammlung aus einer vorhandenen zu entfernen:

Collections.unmodifiableList(list);

Die neue Kollektion sollte zu diesem Zeitpunkt nicht mehr modifizierbar sein:

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

Seit Java 9 können wir eine statische Factory-Methode List.of (E… elements) verwenden, um eine unveränderliche Liste zu erstellen:

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

Beachten Sie, wie wir die vorhandene Liste in ein Array konvertieren müssen . Dies liegt daran, dass List.of (Elemente) vararg-Parameter akzeptiert.

3. Mit Guave

Guava bietet ähnliche Funktionen zum Erstellen einer eigenen Version von ImmutableList :

ImmutableList.copyOf(list);

Ebenso sollte die resultierende Liste nicht geändert werden können:

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

Beachten Sie, dass durch diesen Vorgang tatsächlich eine Kopie der ursprünglichen Liste erstellt wird , nicht nur eine Ansicht.

Guava bietet auch einen Builder - dies gibt die stark typisierte ImmutableList zurück, anstatt einfach 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. Mit den Apache Collections Commons

Schließlich bietet Commons Collection auch eine API zum Erstellen einer nicht änderbaren Liste:

ListUtils.unmodifiableList(list);

Das Ändern der resultierenden Liste sollte wiederum zu einer UnsupportedOperationException führen :

@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. Schlussfolgerung

Dieses Tutorial zeigt, wie Sie mithilfe der JDK-, Google Guava- oder Apache Commons-Kernsammlungen auf einfache Weise eine nicht veränderbare Liste aus einer vorhandenen ArrayList erstellen können .

Die Implementierung all dieser Beispiele und Codefragmente finden Sie auf Github - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.