sabato 18 aprile 2009

Non è mai troppo tardi ...

... per imparare qualcosa di nuovo. Pensavo di sapere praticamente tutto sul "linguaggio" Java. Non parlo delle librerie o delle specifiche collaterali, ma del linguaggio vero e proprio. Eppure proprio ieri ho scoperto qualcosa che non conoscevo.

Così come è possibile aggiungere ad una classe un inizializzatore statico che viene eseguito prima di qualsiasi utilizzo della classe:

public class MiaClasse {
static {
// Codice da eseguire
}
}

ho scoperto che è possibile aggiungere un inizializzatore di istanza:

public class MiaClasse {
{
// Codice da eseguire
}
}

Il codice dell'inizializzatore di istanza viene eseguito dopo l'inizializzazione degli attributi della classe ma prima del costruttore.

Con questo inizializzatore non solo è possibile fattorizzare la parte comune dell'inizializzazione di una classe, che spesso viene ripetuta in ciascun costruttore, ma è fondamentale soprattutto per l'inizializzazione delle istanze di classi anonime, che non possiedono un costruttore. Sarà infatti possibile scrivere:

new ParentClass() {
{
//codice di inizializzazione della classe anonima
}

// resto della classe anonima

};

Questo permette una tecnica detta Double Braced Initialization per l'inizializzazione delle Collection e delle Map. Basta infatti usare la seguente sintassi:

Map m = new HashMap() {{
put("primo", 1L);
put("secondo", 2L);
put("terzo", 3L);
}};

per avere in m una Map subito pronta.

Nessun commento: