So che questo codice:L'inizializzazione della doppia parentesi Java funziona sempre?
Set<String> set = new HashSet<String>() {{
add("test1");
add("test2");
}};
è davvero:
Set<String> set = new HashSet<String>() {
{//initializer
add("test1");
add("test2");
}
};
Il blocco di inizializzazione viene eseguito prima il blocco di costruzione. Nell'esempio precedente, add ("test1") viene chiamato prima che il costruttore sia eseguito. Il costruttore potrebbe inizializzare molti dei campi di istanza, in modo che questa classe possa funzionare. Mi chiedo perché chiamare .add() prima che il costruttore funzioni? C'è qualche caso che causa un problema?
Questo probabilmente rientra in "comportamento non specificato" ... – 11684
Interessante domanda. Non ho una risposta, ma penso che stai facendo un'assunzione errata qui. Se si guarda il costruttore di HashSet, fa questo: 'map = new HashMap();' e il metodo add fa questo: 'restituisce map.put (e, PRESENT) == null;'. Se la tua ipotesi era corretta, ciò causerebbe un NPE. –
[Non è certamente sbagliato pensare se questo "modello" valga davvero la pena] (http://stackoverflow.com/q/924285/521799) –