Le parentesi "esterne" indicano che si sta creando una sottoclasse anonima, le seconde sono l'inizializzatore dell'oggetto. L'inizializzatore viene eseguito prima del costruttore della classe, ma dopo qualsiasi chiamata super
(e quindi anche dopo eventuali inizializzatori della superclasse). È possibile utilizzare gli inizializzatori anche in classi non anonime, che è un modo conveniente per iniziare i campi final
se si hanno diversi costruttori che non possono chiamarsi reciprocamente, o campi che richiedono un'inizializzazione più complessa di quanto consentano gli usuali inizializzatori di campo.
Considerate questa classe:
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;
}
}
Potrebbe essere riscritta come:
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); }
}
Se l'inizializzatore può lanciare un'eccezione controllata, tutti i costruttori devono dichiarare possono buttare.
Immagino che non sia facile google per doppie parentesi. –
@Tom Hawtin: Puoi Google per "doppia parentesi" invece ... –