CodeGym /Corsi /JAVA 25 SELF /Enumerazione: enum

Enumerazione: enum

JAVA 25 SELF
Livello 10 , Lezione 4
Disponibile

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
}
Sintassi della dichiarazione di un'enumerazione enum

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!

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION