Immutable ArrayList in Java

Unveränderliche ArrayList in Java

1. Überblick

Dieses kurze Tutorial zeigthow to make an ArrayList immutable mit dem Kern-JDK, mit Guava und schließlich mit Apache Commons Collections 4.

Dieser Artikel ist Teil vonthe “Java – Back to Basic” series hier am Beispiel.

Weitere Lektüre:

Sammeln Sie einen Java-Stream in eine unveränderliche Sammlung

Erfahren Sie, wie Sie Java-Streams in unveränderlichen Sammlungen sammeln.

Read more

Einführung in Immutables

Ein schneller und praktischer Einstieg in die Immutables-Bibliothek - zum Generieren unveränderlicher Objekte mithilfe von Anmerkungen.

Read more

Java - Zufälliges Element aus einer Liste holen

Eine schnelle und praktische Anleitung zum Auswählen eines oder mehrerer zufälliger Elemente aus einer Liste in Java.

Read more

2. Mit dem JDK

Erstens bietet das JDK eine gute Möglichkeit, eine nicht modifizierbare 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");
}

3. Mit Guave

Guava bietet ähnliche Funktionen zum Erstellen einer eigenen Version vonImmutableList:

ImmutableList.copyOf(list);

Ebenso sollte die resultierende Liste nicht modifizierbar sein:

@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 diese Operation tatsächlichcreate a copy of the original list ist, nicht nur eine Ansicht.

Guava bietet auch einen Builder - dies gibt die stark typisiertenImmutableList anstelle von einfachList zurück:

@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 modifizierbaren Liste:

ListUtils.unmodifiableList(list);

Und wieder sollte das Ändern der resultierenden Liste zu einemUnsupportedOperationException 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. Fazit

Dieses Tutorial zeigt, wie Siecreate an unmodifiable List out of an existing ArrayList einfach mit den Kernsammlungen JDK, Google Guava oder Apache Commons verwenden können.

Die Implementierung all dieser Beispiele und Codefragmentecan be found over on Github - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.