Unveränderliches Set in Java

1. Einleitung

In diesem Tutorial werden verschiedene Möglichkeiten zum Erstellen einer unveränderlichen Menge in Java vorgestellt.

Aber zuerst wollen wir die unveränderliche Menge verstehen und sehen, warum wir sie brauchen.

2. Was ist ein unveränderliches Set?

Im Allgemeinen ändert ein unveränderliches Objekt seinen internen Zustand nicht, sobald wir es erstellen. Dies macht es standardmäßig threadsicher. Die gleiche Logik gilt für unveränderliche Mengen.

Nehmen wir an, wir haben eine HashSet- Instanz mit einigen Werten. Wenn Sie es unveränderlich machen, wird eine schreibgeschützte Version unseres Sets erstellt. Daher löst jeder Versuch, seinen Status zu ändern, die UnsupportedOperationException aus .

Also, warum brauchen wir es?

Der häufigste Anwendungsfall eines unveränderlichen Satzes ist sicherlich eine Multithread-Umgebung. So können wir unveränderliche Daten über die Threads hinweg teilen, ohne uns um die Synchronisation kümmern zu müssen.

In der Zwischenzeit ist ein wichtiger Punkt zu beachten: Unveränderlichkeit bezieht sich nur auf das Set und nicht auf seine Elemente . Darüber hinaus können wir die Instanzreferenzen der Set-Elemente problemlos ändern.

3. Erstellen Sie unveränderliche Mengen in Core Java

Mit nur den Java-Kernklassen können wir die Sammlungen verwenden . unmodizableSet () -Methode zum Umschließen des ursprünglichen Sets .

Zuerst erstellen wir eine einfache HashSet- Instanz und initialisieren sie mit String- Werten:

Set set = new HashSet(); set.add("Canada"); set.add("USA");

Als nächstes schließen wir es mit Sammlungen ab . unmodifizierbares Set ():

Set unmodifiableSet = Collections.unmodifiableSet(set);

Um sicherzustellen, dass unsere unmodifizierbare Set- Instanz unveränderlich ist, erstellen wir einen einfachen Testfall:

@Test(expected = UnsupportedOperationException.class) public void testUnmodifiableSet() { // create and initialize the set instance Set unmodifiableSet = Collections.unmodifiableSet(set); unmodifiableSet.add("Costa Rica"); }

Wie erwartet wird der Test erfolgreich ausgeführt. Darüber hinaus ist die Operation add () für die Instanz unmodizableSet verboten und löst die Ausnahme UnsupportedOperationException aus .

Ändern wir nun die anfängliche Set- Instanz, indem wir denselben Wert hinzufügen:

set.add("Costa Rica");

Auf diese Weise modifizieren wir indirekt die nicht modifizierbare Menge. Wenn wir also die unmodifizierbare Set- Instanz drucken :

[Canada, USA, Costa Rica]

Wie wir sehen können, ist der Artikel „Costa Rica“ auch in unmodifizierbarem Set vorhanden.

4. Erstellen Sie unveränderliche Mengen in Java 9

Seit Java 9 steht die statische Factory-Methode Set.of (elements) zum Erstellen unveränderlicher Mengen zur Verfügung:

Set immutable = Set.of("Canada", "USA");

5. Erstellen Sie unveränderliche Mengen in Guave

Eine andere Möglichkeit, eine unveränderliche Menge zu erstellen, ist die Verwendung der ImmutableSet- Klasse von Guava . Es kopiert die vorhandenen Daten in eine neue unveränderliche Instanz. Infolgedessen ändern sich die Daten in ImmutableSet nicht, wenn wir das ursprüngliche Set ändern .

Wie bei der Java-Kernimplementierung wird bei jedem Versuch, die erstellte unveränderliche Instanz zu ändern, eine UnsupportedOperationException ausgelöst .

Lassen Sie uns nun verschiedene Möglichkeiten zum Erstellen unveränderlicher Instanzen untersuchen.

5.1. Verwenden von ImmutableSet. Kopie von()

Einfach gesagt, das ImmutableSet . Die copyOf () -Methode gibt eine Kopie aller Elemente in der Menge zurück:

Set immutable = ImmutableSet.copyOf(set);

Nach dem Ändern des ursprünglichen Satzes bleibt die unveränderliche Instanz also dieselbe:

[Canada, USA]

5.2. Verwenden von ImmutableSet .of ()

In ähnlicher Weise können wir mit der ImmutableSet.of () -Methode sofort eine unveränderliche Menge mit den angegebenen Werten erstellen:

Set immutable = ImmutableSet.of("Canada", "USA");

Wenn wir keine Elemente angeben, gibt ImmutableSet.of () eine leere unveränderliche Menge zurück.

Dies kann mit Java 9s Set .of () verglichen werden .

6. Fazit

In diesem kurzen Artikel haben wir unveränderliche Mengen in der Java-Sprache besprochen . Darüber hinaus haben wir gezeigt, wie unveränderliche Sets mithilfe der Collections-API aus Java, Java 9 und der Guava-Bibliothek erstellt werden.

Schließlich ist der vollständige Code für diesen Artikel wie üblich auf GitHub verfügbar.