Die "äußeren" geschweiften Klammern bedeuten, dass Sie eine anonyme Unterklasse erstellen, die zweite geschweifte Klammern sind die Objektinitialisierer. Der Initialisierer wird vor dem Konstruktor der Klasse ausgeführt, aber nach irgendwelchen super
Aufrufen (und daher auch nach irgendwelchen Superklassen-Initialisierern). Sie können Initialisierer auch in nicht anonymen Klassen verwenden, was eine bequeme Möglichkeit ist, Felder final
zu initiieren, wenn Sie mehrere Konstruktoren haben, die sich nicht gegenseitig aufrufen können, oder Felder, die eine komplexere Initialisierung als übliche Feldinitialisierungen erfordern.
Betrachten Sie diese Klasse:
class X extends Y{
private final int lulz;
private static boolean someCondition(){...}
private static boolean danger() throws SomeException { ... }
public X(A a) throws SomeException {
super(a);
lulz = someCondition()? danger() : 0;
}
public X(B b) throws SomeException {
super(b);
lulz = someCondition()? danger() : 0;
}
}
Es umgeschrieben werden:
class X extends Y{
private final int lulz;
private static boolean someCondition(){...}
private static boolean danger() throws SomeException { ... }
{ // initalizer -- might throw SomeException!
lulz = someCondition()? danger() : 0;
}
public X(A a) throws SomeException { super(a); }
public X(B b) throws SomeException { super(b); }
}
Wenn die Initialisierung eine geprüfte Ausnahme auslösen können, sind alle Konstrukteure erklären müssen sie es werfen kann.
Ich denke, es ist nicht einfach, nach Doppelstreben zu googeln. –
@Tom Hawtin: Sie können Google stattdessen für "double brace" verwenden ... –