Die “Double Brace Initialization” zum Initialisieren von Listen, Maps oder Sets

Einen wirklich interessanten Ansatz eine Liste, Map oder Set mit Werten zu initialisieren wenn diese statisch ist oder man eine diese einer Methode übergeben möchte habe ich mit dem Namen “Double Brace Initialization” auf 2c.com Java Idioms gefunden.

Im folgenden der Java Schnipsel wie man eine statische Liste initialisieren würde:

private static final Set VALID_CODES = new HashSet();
static {
  validCodes.add("XZ13s");
  validCodes.add("AB21/X");
  validCodes.add("YYLEX");
  validCodes.add("AR2D");
}

Mit der “Double Brace Initialization” sieht dieser Schnipsel nun wie eine Expression aus:

private static final Set VALID_CODES = new HashSet() {{
  add("XZ13s");
  add("AB21/X");
  add("YYLEX");
  add("AR2D");
}};

Ein häufiger auftretendes Problem ist aber das Initialisieren einer Liste, Map oder Set wenn diese als Methodenparameter übergeben werden soll. In der Regel sieht das dann in etwas so aus:

Set validCodes = new HashSet();
validCodes.add("XZ13s");
validCodes.add("AB21/X");
validCodes.add("YYLEX");
validCodes.add("AR2D");
removeProductsWithCodeIn(validCodes);

Mit der neuen Schreibweise verkürzt sich dieses Stücken Code auf eine Zeile:

removeProductsWithCodeIn(new HashSet() {{
  add("XZ13s");
  add("AB21/X");
  add("YYLEX");
  add("AR5E");
}});

Letztlich ist diese Art des initialen Befüllens nicht wirklich etwas Besonderes – zumindest aus Java Sicht . Die erste Klammer aus der “double brace initialization” erstellt eine anonyme Klasse und die zweite einen Initialisierungsblock innerhalb der anonymen Klasse. Es wird also ganz normale Java Technik verwendet lediglich die neue Art der Schreibweise ist mal etwas anderes.

Nun noch abschließend die wirklich brauchbare Info, dass man sehr einfach eine Liste mit Arrays.asList() initialisieren kann:

List myList = new ArrayList(Arrays.asList("One", "Two", "Three"));

Diese Hilfsmethode Arrays.asList() sollte man sich also merken.

Wie auch immer man eine Liste initialisiert – die “Double Brace Initiliazation” ist mal eine andere Art =)

(Alle Beispiele wurden eins zu eins aus dem entsprechenden Artikel auf 2c.com übernommen)

Tags: , , , ,

Wenn du Fragen oder Anregungen zum Post hast, dann hinterlasse doch einen Kommentar oder wenn du weiterhin Artikel von Javathreads lesen möchtest, dann abonniere den RSS Feed und sehe direkt in deinem Feed Reader die nächsten Artikel.

Ähnliche Artikel, die dich interessieren könnten:
Kommentare

Die Schreibweise gefällt mir – ist mir bisher aber noch nicht untergekommen. Neben der Lesbarkeit gefällt mir vor allem der Zusammenhalt besonders gut. So wird einem der Block auch bei automatischer Generieung von Feldern/Konstanten nicht mehr auseinandergerissen.

Das Dilemma bei der “Double Brace Initialization” ist, dass eine Unterklasse erzeugt wird, also eine neue .class Datei, mit allen, was dadran hängt. Man bürdet der JVM also relativ viel auf, nur das die Schreibweise etwas “cooler” ist. Bei dem static-Block ist dagegen keine neue Klassendatei nötig. Bei Java ME oder GWT sollte man das bedenken.

Bei removeProductsWithCodeIn() wird durch Arrays.asList() auch IMHO viel besser:

removeProductsWithCodeIn( new HashSet( Arrays.asList(“XZ13s”, “bla”, “rababer”) ) );

Hinterlasse einen Kommentar