Avevo la seguente necessità: nel mio codice si fa spesso riferimento ad una costante; nel mio caso però il valore di questa costante non è cablato nel codice (o "inchiodato" come dice il mio capo al lavoro), ma è letto da un file di properties attraverso il metodo statico getString(String key) della classe Config.
Purproppo il mio metodo getString lancia un'eccezione nel caso fallisca la lettura dal file, quindi il compilatore rifiuta una scrittura del tipo:
public static final int NUM = Integer.parseInt(Config.getString("costante.numerica"));
*si noti che se il metodo getString non lanciasse eccezioni checked tale istruzione sarebbe accettata.
Mi son da subito venute in mente due soluzioni, poco eleganti ma che avrebbero funzionato: la prima era quella di scrivermi un wrapper per il getString che non lanciasse eccezioni, la seconda quello di rendere la costante private ed utilizzare un metodo statico per leggerla che la iniziasse nel caso non avesse ancora valore (in questo caso non poteva più essere dichiarata final e utilizzavo un wrapper in modo da verificare il non assegnamento col valore null, in pratica avrei simulato una costante con un campo non mutable); non vi dico che nessuna delle due soluzioni mi facesse saltare di gioia ;-)
Quando ormai ero quasi rassegnato ho trovato una soluzione di quelle che piaciono a me: static initializations block. Sinceramente prima di imbattermici contro (studiando per ottenere la certificazione Sun CX-310-065 ) non sapevo neanche si potesse fare qualcosa del genere in Java ;-). Sono blocchi di codice che vengono eseguiti una singola volta quando la classe viene caricata per la prima volta.
Il codice prodotto suona così:
public class Constants {
public static final int NUM;
static {
long j = 0;
try {
j = Integer.parseInt(Config.getString("costante.numerica"));
}
catch (Exception e) {
//non dovrei mai arrivare in questa situazione
assert(false);
}
NUM = j;
}
}
Una nota per concludere: possono essere presenti più di un blocco static: essi verranno eseguiti tutti, nell'ordine in cui compaiono nel codice.
Accanto ai blocchi statici ci sono gli instance initialization blocks. Come dice il nome questi ultimi sono legati alle istanze e vengono eseguiti ogni volta che viene creata un'istanza di una classe... ma questa è un'altra storia!
Iscriviti a:
Commenti sul post (Atom)

Nessun commento:
Posta un commento