JavaRush /Java Blog /Random-IT /Enum in Java: come utilizzare la classe

Enum in Java: come utilizzare la classe

Pubblicato nel gruppo Random-IT
Ciao! In questo articolo ti parlerò di Java Enums. Immagina che ti sia stato affidato un compito: creare una classe che implementi i giorni della settimana . A prima vista, non c'è nulla di complicato in questo e il tuo codice sarà simile a questo:
public class DayOfWeek {

   private String title;

   public DayOfWeek(String title) {
       this.title = title;
   }

   public static void main(String[] args) {
       DayOfWeek dayOfWeek = new DayOfWeek("Saturday");
       System.out.println(dayOfWeek);
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
E tutto sembra andare bene, ma c'è un problema: puoi passare qualsiasi testo al costruttore della classe DayOfWeek . In questo modo qualcuno può creare il giorno della settimana "Rana", "Nuvola" o "azaza322". Questo chiaramente non è il comportamento che ci aspettiamo, perché ci sono solo 7 giorni reali della settimana e ognuno di essi ha un nome. Pertanto, il nostro compito è limitare in qualche modo l'intervallo di valori possibili per la classe “ giorno della settimana ”. Prima di Java 1.5, gli sviluppatori erano costretti a trovare da soli una soluzione a questo problema, poiché non esisteva una soluzione già pronta nel linguaggio stesso. A quei tempi, se la situazione richiedeva un numero limitato di valori, si faceva così:
public class DayOfWeek {

   private String title;

   private DayOfWeek(String title) {
       this.title = title;
   }

   public static DayOfWeek SUNDAY = new DayOfWeek("Sunday");
   public static DayOfWeek MONDAY = new DayOfWeek("Monday");
   public static DayOfWeek TUESDAY = new DayOfWeek("Tuesday");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Wednesday");
   public static DayOfWeek THURSDAY = new DayOfWeek("Thursday");
   public static DayOfWeek FRIDAY = new DayOfWeek("Friday");
   public static DayOfWeek SATURDAY = new DayOfWeek("Saturday");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
A cosa dovresti prestare attenzione qui:
  • Costruttore privato. Se un costruttore è contrassegnato con il modificatore private , non è possibile creare un oggetto della classe utilizzando quel costruttore. E poiché in questa classe è presente un solo costruttore, l' oggetto DayOfWeek non può essere creato affatto.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • Allo stesso tempo, la classe conteneva il numero richiesto di oggetti statici pubblici che erano stati inizializzati nel modo necessario (i nomi dei giorni sono corretti).

    Ciò ha reso possibile utilizzare oggetti in altre classi.

    public class Man {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }

    Conclusione:

    Giorno della settimana{title='domenica'}

Questo approccio ci ha permesso in gran parte di risolvere il problema. Avevamo a disposizione 7 giorni alla settimana e nessuno poteva crearne di nuovi. Questa soluzione è stata proposta da Joshua Bloch nel libro Effective Java . Il libro, tra l'altro, è molto interessante e una lettura obbligata per qualsiasi sviluppatore Java.
Come utilizzare la classe Enum - 2
Con il rilascio di Java 1.5, il linguaggio ha introdotto una soluzione già pronta per tali situazioni: l' enumerazione Enum . Anche Enum è una classe. Ma è appositamente “su misura” per risolvere problemi simili ai nostri: la creazione di una certa gamma limitata di valori. Poiché i creatori di Java avevano già esempi già pronti (ad esempio, il linguaggio C, in cui già esisteva Enum ), sono stati in grado di creare l'opzione ottimale.

Cos'è l'enum?

Allora, cos'è Enum in Java ? Diamo un'occhiata all'esempio dello stesso DayOfWeek :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Sembra già molto più semplice :) All'interno della nostra Enum ci sono 7 costanti con accesso statico. Possiamo già usarlo per implementare la logica nel programma. Ad esempio, scriviamo un programma che determinerà se uno studente ha bisogno di andare a scuola oggi. Il nostro studente avrà la sua routine quotidiana, designata dalla classe ScholarSchedule :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
La variabile dayOfWeek in modalità giorno determina che giorno è. Ed ecco la classe del nostro studente:
public class Scholar {

   private ScholarSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep some more!");
       } else {
           System.out.println("Damn, back to school :(");
       }
   }
}
Nel metodo wakeUp() , utilizzando Enum, determiniamo le ulteriori azioni dello studente. Non abbiamo nemmeno descritto in dettaglio cosa significa ciascuna variabile in DayOfWeek , e questo non è necessario: il meccanismo dei giorni della settimana è già ovvio, e se lo usiamo nella sua forma attuale, qualsiasi sviluppatore capirà cosa sta accadendo nel tuo codice. Un altro esempio della comodità di Enum è che le sue costanti possono essere utilizzate con un'istruzione switch . Ad esempio, stiamo scrivendo un programma per una dieta rigorosa, in cui i pasti sono programmati di giorno in giorno:
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday lunch! Today you can even have a little sweet");
               break;
           case MONDAY:
               System.out.println("Monday Lunch: Chicken Noodles!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today is celery soup :(");
               break;
               //...and so on until the end
       }
   }
}
Questo è uno dei vantaggi di Enum rispetto alla vecchia soluzione utilizzata prima di Java 1.5: la vecchia soluzione non poteva essere utilizzata con switch .

Cos'altro devi sapere sulla classe Enum?

La classe Enum è una vera classe con tutte le funzionalità che ne derivano. Ad esempio, se l'attuale implementazione dei giorni della settimana non è sufficiente per te, puoi aggiungere variabili, costruttori e metodi a DayOfWeek :
public enum DayOfWeek {

   SUNDAY ("Sunday"),
   MONDAY ("Monday"),
   TUESDAY ("Tuesday"),
   WEDNESDAY ("Wednesday"),
   THURSDAY ("Thursday"),
   FRIDAY ("Friday"),
   SATURDAY ("Saturday");

   private String title;

   DayOfWeek(String title) {
       this.title = title;
   }

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Le costanti del nostro Enum ora hanno un campo titolo , un getter e un metodo toString sovrascritto . Rispetto alle classi normali, Enum presenta una seria limitazione: non può essere ereditata. Inoltre, le enumerazioni hanno metodi unici:
  • valori() : restituisce un array di tutti i valori memorizzati in Enum :

    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }

    Conclusione:

    [DayOfWeek{title='domenica'}, DayOfWeek{title='lunedì'}, DayOfWeek{title='martedì'}, DayOfWeek{title='mercoledì'}, DayOfWeek{title='giovedì'}, DayOfWeek{title= 'Venerdì'}, DayOfWeek{title='Sabato'}]

  • ordinal() : restituisce il numero ordinale di una costante. Il conto alla rovescia parte da zero:

    public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }

    Conclusione:

    0

  • valueOf() : Restituisce un oggetto Enum corrispondente al nome specificato:

    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }

    Conclusione:

    Giorno della settimana{title='domenica'}

Fai attenzione:Mettiamo in maiuscolo i nomi degli elementi Enum perché sono costanti e sono designati come costanti, non camelCase .
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION