Java Double Brace-Initialisierung

1. Übersicht

In diesem kurzen Tutorial zeigen wir, wie doppelte Klammern zum Erstellen und Initialisieren von Objekten in einem einzelnen Java-Ausdruck verwendet werden können .

Wir werden auch untersuchen, warum diese Technik als Anti-Muster angesehen werden kann.

2. Standardansatz

Normalerweise initialisieren und füllen wir eine Reihe von Ländern wie folgt:

@Test public void whenInitializeSetWithoutDoubleBraces_containsElements() { Set countries = new HashSet(); countries.add("India"); countries.add("USSR"); countries.add("USA"); assertTrue(countries.contains("India")); } 

Wie aus dem obigen Beispiel ersichtlich ist, machen wir Folgendes:

  1. Erstellen Sie eine Instanz von HashSet
  2. Fügen Sie dem HashSet Länder hinzu
  3. Schließlich stellen wir fest, ob das Land im HashSet vorhanden ist

3. Verwenden Sie Double Brace

Wir können die Erstellung und Initialisierung jedoch tatsächlich in einer einzigen Anweisung kombinieren. Hier verwenden wir Doppelklammern:

@Test public void whenInitializeSetWithDoubleBraces_containsElements() { Set countries = new HashSet() { { add("India"); add("USSR"); add("USA"); } }; assertTrue(countries.contains("India")); } 

Wie aus dem obigen Beispiel ersichtlich ist, sind wir:

  1. Erstellen einer anonymen inneren Klasse, die HashSet erweitert
  2. Bereitstellen eines Instanzinitialisierungsblocks, der die Methode add aufruft und den Ländernamen zum HashSet hinzufügt
  3. Schließlich können wir feststellen, ob das Land im HashSet vorhanden ist

4. Vorteile der Verwendung von Doppelklammern

Die Verwendung von Doppelklammern bietet einige einfache Vorteile:

  • Weniger Codezeilen im Vergleich zur nativen Art der Erstellung und Initialisierung
  • Der Code ist besser lesbar
  • Die Erstellungsinitialisierung erfolgt im selben Ausdruck

5. Nachteile der Verwendung von Doppelklammern

Nachteile der Verwendung von Doppelklammern sind:

  • Obskure, nicht allgemein bekannte Methode zur Initialisierung
  • Jedes Mal, wenn wir es verwenden, wird eine zusätzliche Klasse erstellt
  • Unterstützt nicht die Verwendung des "Diamantoperators" - eine in Java 7 eingeführte Funktion
  • Funktioniert nicht, wenn die Klasse, die wir erweitern möchten, als endgültig markiert ist
  • Enthält einen versteckten Verweis auf die einschließende Instanz, der zu Speicherverlusten führen kann

Aufgrund dieser Nachteile wird die Initialisierung von Doppelklammern als Anti-Pattern angesehen.

6. Alternativen

6.1. Stream Factory-Methoden

Stattdessen können wir die neue Java 8 Stream-API gut nutzen, um unser Set zu initialisieren :

@Test public void whenInitializeUnmodifiableSetWithDoubleBrace_containsElements() { Set countries = Stream.of("India", "USSR", "USA") .collect(collectingAndThen(toSet(), Collections::unmodifiableSet)); assertTrue(countries.contains("India")); } 

6.2. Factory-Methoden für Java 9-Sammlungen

Außerdem bietet Java 9 eine Reihe nützlicher Factory-Methoden, die Folgendes ermöglichen:

List list = List.of("India", "USSR", "USA"); Set set = Set.of("India", "USSR", "USA"); 

Sie können mehr darüber in diesem Artikel lesen.

7. Fazit

In diesem kurzen Tutorial haben wir die Verwendung von Doppelklammern sowie ihre Vor- und Nachteile erörtert.

Die Implementierung dieser Beispiele finden Sie im GitHub-Projekt - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und unverändert auszuführen sein.