Ich weiß, dass dieser Code:Java Double Brace Initialisierung funktioniert immer?
Set<String> set = new HashSet<String>() {{
add("test1");
add("test2");
}};
ist wirklich:
Set<String> set = new HashSet<String>() {
{//initializer
add("test1");
add("test2");
}
};
Der Initialisierungsblocks vor der Konstruktor Block ausgeführt wird, ist. Im obigen Beispiel wird add ("test1") vor der Ausführung des Konstruktors aufgerufen. Der Konstruktor initialisiert möglicherweise viele der Instanzfelder, so dass diese Klasse funktionieren würde. Ich frage mich, warum Aufruf .add() vor dem Konstruktor würde funktionieren? Gibt es einen Fall, der ein Problem verursacht?
Dies wird wahrscheinlich unter "nicht spezifiziertes Verhalten" fallen ... – 11684
Interessante Frage. Ich habe keine wirkliche Antwort, aber ich denke, Sie machen hier eine falsche Annahme. Wenn man sich den Konstruktor von HashSet anschaut, tut man folgendes: map = new HashMap(); 'und die add-Methode macht das:' return map.put (e, PRESENT) == null; '. Wenn Ihre Annahme richtig war, würde dies eine NPE verursachen. –
[Es ist sicherlich nicht falsch darüber nachzudenken, ob dieses "Muster" wirklich das Problem wert ist] (http://stackoverflow.com/q/924285/521799) –