1. Introduzione
Nella programmazione spesso si lavora con elenchi di opzioni predefinite e limitate. Per esempio: i giorni della settimana, i colori del semaforo, i livelli di difficoltà di un gioco, gli stati di un ordine. Ognuna di queste opzioni è solitamente rappresentata da un valore fisso. Ed è qui che ci avviciniamo all’argomento di oggi — le enumerazioni (enum).
Un’enumerazione è un tipo di dato speciale che consente di dichiarare un insieme di costanti denominate.
enum — è come una scatola con etichette disposte in scomparti, dove ogni etichetta è un nome univoco associato a un numero.
Vantaggi principali di enum:
- Il tuo codice diventa leggibile e autoesplicativo;
- Invece dei misteriosi «numeri magici» come 0, 1, 2 compaiono nomi espressivi: DayOfWeek.MONDAY o TrafficLight.RED;
- Il compilatore segnalerà un errore se provi ad assegnare un valore non valido;
- Dietro ogni elemento si nasconde… un normale numero intero! (Ma a questo torneremo più avanti.)
Sintassi della dichiarazione di enum
// Modello generale per la dichiarazione di un'enumerazione
public enum Imya
{
KONSTANTA1 ,
KONSTANTA2 ,
KONSTANTA3
}
Dichiarare un’enumerazione in Java è molto semplice. Ecco un esempio di base:
// File DayOfWeek.java
public enum DayOfWeek {
MONDAY, // 0
TUESDAY, // 1
WEDNESDAY, // 2
THURSDAY, // 3
FRIDAY, // 4
SATURDAY, // 5
SUNDAY // 6
}
Spiegazione:
- La parola chiave enum dice al compilatore: «Questa è un’enumerazione!»
- Tra le parentesi graffe, separati da virgole, vanno i nomi delle opzioni (costanti).
- È consuetudine scrivere i nomi in UPPER_SNAKE_CASE (tutte le lettere maiuscole, parole separate da underscore).
Dove si può dichiarare un enum?
- In un file separato (DayOfWeek.java).
- All'interno di una classe (se serve un’enumerazione privata solo per quella classe).
- Perfino dentro un metodo (ma è raro).
2. Uso di enum nel codice
Dichiarazione di una variabile enum:
DayOfWeek today = DayOfWeek.MONDAY;
Ora today può assumere solo uno dei valori dichiarati in DayOfWeek.
Esempio di utilizzo con switch
switch (today)
{
case MONDAY:
System.out.println("Oh, lunedì...");
break;
case FRIDAY:
System.out.println("Evviva, è venerdì!");
break;
default:
System.out.println("Un giorno normale.");
}
Differenza importante: nei case si scrive solo il nome della costante (senza prefisso), se il tipo della variabile è già noto al compilatore.
Iterare su tutti i valori dell'enum
Ogni enum ha un metodo statico values(), che restituisce un array di tutti i suoi valori:
for (DayOfWeek day : DayOfWeek.values())
{
System.out.println(day);
}
È molto comodo per stampare menu, validare, generare opzioni, ecc.
3. Metodi di enum: name(), ordinal(), valueOf()
Le enumerazioni in Java — non sono solo elenchi di costanti, ma vere e proprie classi con metodi!
Metodo name()
Restituisce il nome della costante come stringa (come è scritto nel codice):
DayOfWeek day = DayOfWeek.FRIDAY;
System.out.println(day.name()); // "FRIDAY"
Metodo ordinal()
Restituisce l’indice della costante (contando da zero):
System.out.println(DayOfWeek.MONDAY.ordinal()); // 0
System.out.println(DayOfWeek.FRIDAY.ordinal()); // 4
Attenzione: Non conviene memorizzare o confrontare enum tramite ordinal(), se l’ordine potrebbe cambiare in futuro! Meglio usare i nomi.
Metodo valueOf(String name)
Converte una stringa in un valore dell’enum, se esiste una costante con quel nome:
DayOfWeek day = DayOfWeek.valueOf("MONDAY");
System.out.println(day); // MONDAY
Se la stringa non corrisponde — verrà lanciata l’eccezione IllegalArgumentException.
Metodo values()
Restituisce l’array di tutti i valori dell’enum (esempio già visto sopra):
DayOfWeek[] days = DayOfWeek.values();
4. Enum con campi, costruttore e metodi
Le enumerazioni in Java possono essere estese: aggiungere campi, costruttori, metodi! Sì, non è solo un elenco di nomi, ma una mini-classe.
Esempio: giorni della settimana con nome localizzato
public enum DayOfWeek
{
MONDAY("Lunedì"),
TUESDAY("Martedì"),
WEDNESDAY("Mercoledì"),
THURSDAY("Giovedì"),
FRIDAY("Venerdì"),
SATURDAY("Sabato"),
SUNDAY("Domenica");
private final String russianName;
// Costruttore (private per impostazione predefinita)
DayOfWeek(String russianName)
{
this.russianName = russianName;
}
public String getRussianName()
{
return russianName;
}
}
Scoprirai in dettaglio come funziona quando inizieremo a studiare l’OOP ai livelli 27+ :P
Ora puoi fare così:
DayOfWeek day = DayOfWeek.WEDNESDAY;
System.out.println(day.getRussianName()); // "Mercoledì"
Trucco: Ogni valore dell’enum può avere i propri dati (in questo caso — il nome localizzato).
Vantaggi dell’uso di enum
- Sicurezza dei tipi: impossibile assegnare alla variabile enum un valore non presente nell’elenco.
- Leggibilità: il codice si documenta da sé (TrafficLight.RED invece di 1 o "red").
- Manutenibilità: se serve aggiungere o rimuovere un’opzione, lo si fa in un solo punto.
- Funziona con switch: enum è perfetto per diramazioni basate sui valori.
- Estendibile: è possibile aggiungere campi, metodi, implementare interfacce.
- Meno errori: il compilatore aiuta a non dimenticare di gestire i casi (soprattutto nelle costruzioni switch).
6. Pratica: usiamo enum nella nostra applicazione
Aggiungiamo al nostro mini‑app il supporto dei giorni della settimana tramite enum.
Passo 1. Dichiariamo l'enum
public enum DayOfWeek
{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Passo 2. Usiamolo nel codice
System.out.println("Inserisci il giorno della settimana (ad esempio, MONDAY):");
Scanner console = new Scanner(System.in);
String input = console.nextLine().toUpperCase();
DayOfWeek day = DayOfWeek.valueOf(input);
switch (day)
{
case MONDAY:
System.out.println("Inizio della settimana lavorativa!");
break;
case FRIDAY:
System.out.println("Il weekend è vicino!");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Evviva, è il weekend!");
break;
default:
System.out.println("Un normale giorno lavorativo.");
}
Cosa succede:
- L’utente inserisce un giorno della settimana (per esempio, "monday" o "MONDAY").
- Convertiamo la stringa in maiuscolo (toUpperCase()), così da non dipendere dal caso.
- Convertiamo la stringa in un valore dell’enum tramite valueOf.
- Usiamo switch per stampare un messaggio diverso.
- Se viene inserito qualcosa di errato — intercettiamo l’errore e mostriamo un avviso.
7. Errori tipici nell’uso di enum
Errore n. 1: usare stringhe o numeri al posto di enum. Molto spesso i principianti continuano a scrivere così:
int day = 1; // 1 — è lunedì?
oppure
String status = "DELIVERED";
Questo è male: ci si può sbagliare a scrivere, ed è difficile mantenere il codice. Usa enum!
Errore n. 2: confrontare gli enum con == e .equals(). In Java i valori di enum si possono confrontare con == — è sicuro, perché tutti i valori sono unici nell’ambito della classe enum:
if (day == DayOfWeek.MONDAY) { ... } // OK!
Sebbene .equals() funzioni, si usa più spesso ==.
Errore n. 3: nomi scadenti per gli elementi dell’enum. Non chiamare gli elementi VALUE1, VALUE2, VALUE3 — tra un mese nessuno capirà cosa significano! Usa nomi significativi.
Errore n. 4: usare ordinal() per la logica. Non scrivere così:
if (day.ordinal() == 0) { ... } // Non farlo!
L’ordine degli elementi può cambiare, e tutto si romperà. Usa i nomi!
GO TO FULL VERSION