Schnelle Map/Set/List Initialisierung mit der „Double Brace Initialization“

Oft möchte man in Java eine HashMap anlegen und diese direkt auch mit Werten füllen. Mit normalen Methoden ist das so nicht möglich. Benötigt man die Map (Set, Liste, Array …) nur temporär muss man immer unschön mit add() neue Werte hinzufügen:

Set validCodes = new HashSet();
 
validCodes.add("aaa");
validCodes.add("bbb");
validCodes.add("ccc");
 
removeProductsWithCodeIn(validCodes);

Das erzeugt schlecht lesbaren Code und außerdem auch Overhead. Schöner wäre es, wenn man das Set gleich mit den Werten während der Initialisierung füllen könnte.

Das kann man seit Java 1.5 schon wie folgt erledigen, mit der „Double Brace Initialization“, also der Doppelklammer Initialisierung:

removeProductsWithCodeIn(new HashSet() {{
	add("aaa");
	add("bbb");
	add("ccc");
}});

Dies erzeugt genau das gleiche Resultat wie oben, vermeidet aber unnötige Codezeilen.

Was genau passiert dort nun? Also die ersten {} erzeugen eine neue anonyme innere Klasse (AnonymousInnerClass), die zweiten {} innerhalb der jetzt erzeugten anonymen inneren Klasse erzeugen einen sogenannten „instance initializer block“, also einen Block, der beim instanziieren der Klasse initialisiert wird. Klingt kompliziert, heißt aber nur, das was dort steht wird dann ausgeführt. Da eine innere Klasse erzeugt wird, klappt dieses Vorgehen nur bei nicht finalen Klassen (non-final).

Diese Methode ist nicht auf Collections beschränkt, sie funktioniert auch mit Objekten:

add(new JPanel() {{
	setLayout(...);
	setBorder(...);
	add(new JLabel(...));
}});

Ein einziges Problem gibt es allerdings, eine equals() Methode die wie folgt implementiert ist, greift nicht mehr korrekt:

public boolean equals(final Object o) {
	if (o == null) {
		return false;
	} else if (!getClass().equals(o.getClass())) {
		return false;
	} else {
		Example other = (Example) o;
		// Compare this to other.
	}
}

Warum? Ganz einfach, die neue erzeugte anonyme innere Klasse ist ja eine neue Klasse und damit nicht mehr gleich zur alten äußeren Klassen. Hier muss man also etwas aufpassen!

(via)

Ein Kommentar zu „Schnelle Map/Set/List Initialisierung mit der „Double Brace Initialization“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert