Nle linguaggio Java, a partire dalla versione 1.5, sono stati introdotti gli enumeratori, cioè degli oggetti particolari che funzionano come degli insiemi immutabili.
Fino alla prittaforma 1.4.2 il programmatore era costretto ad arginare questa mancanza utilizzando delle costanti statiche di vario tipo, solitamente int e char per non pesare troppo sulla memoria. La tecnica delle costanti è alla base degli enum e di per se non è sbagliata am in alcune circostanze è “rischiosa” poichè può indurre ad errori.
Gli enum sono stati creati con l’intenzione di rendere più sicura e maggiormente mantenibile questa conosciuta ed ormai collaudata tecnica, come già detto questi non sono altro che insiemi finiti di costanti, ai quali non è necessario attribuire un valore poichè già essi corrispondono per loro natura ad un valore differente dalgi altri membri dell’insieme.
Consideriamo il seguente codice per creare un enumeratore che modella un insieme di 5 elementi.
public enum ProvaEnum {
ELEMENTO_1, ELEMENTO_2, ELEMENTO_3, ELEMENTO_4, ELEMENTO_5;
}
E consideriamo inoltre i seguenti metodi
public void stampaElementoEnumeratore(ProvaEnum valore) {
System.out.println("Il valore dell'elemento fornito è: " + valore);
}
public void stampaElementiEnumeratore() {
for (ProvaEnum value : ProvaEnum.values()) {
stampaElementoEnumeratore(value);
}
}
Il primo metodo stampa l’oggetto fornito su standard output ed è in grado di ricevere solament uno dei valori esplicitati nella creazione dell’enumeratore. Il secondo metodo invece ottiene dall’enumeratore l’insieme degli elementi definiti ed invoca su di ognuno di essi il metodo definito poco sopra.
Proviamo a pensare ad un contesto in cui viene utilizzata ancora la, oramai obsoleta, tecnica delle costanti. Nel toolkit grafico Swing si usa, per questioni di retrocompatibilità, in modo massiccio la vecchia metodologia ed una programmazione errata può portare a degli errori imprevedibili.
Consideriamo il BoxLayout questo può essere disporre i componenti di un pannello affiancandoli in 4 orientamenti: sull’asse X, sull’asse Y, sull’asse X relativo (LINE_AXIS) e rispetto all’asse Y relativo (PAGE_AXIS). Questi orientamenti vengono selezionati fornendo al costruttore un valore numerico; solitamente si è portati ad utilizzare le costanti messe a disposizione dalla classe ma nulla ci vieterebbe di fornire direttamente un valore intero.
Adesso provate a pensare, se fornite un valore intero che non corrisponde a nessuna delle 4 costanti cosa succede? Io non ho mai provato e sono convinto che gli ingegneri che hanno progettato il toolkit e gli sviluppatori che lo hanno realizzato hanno previsto questa ipotesi e quindi sicuramente avranno implementatoun meccanismo di controllo per prevenire errori di questo tipo.
Con gli enumeratori non sarebbero necessari questi controlli e quindi si potrebbe scrivere codice più efficiente in fase di runtime dato che i controlli del caso verrebbero svolti in fase di compilazione, quidni una sola volta in tutta la vita dell’applicazione.
Continueremo con la trattazionedegli enumeratori nei prossimi giorni.
Buon divertimento!