CodeGym /Java Blog /Random-IT /Classe enum in Java
John Squirrels
Livello 41
San Francisco

Classe enum in Java

Pubblicato nel gruppo Random-IT
CIAO! In questo articolo vi parleremo di Java Enums . Immagina di aver ricevuto il seguente compito: crea una classe che implementi i giorni della settimana . A prima vista, questo sembra piuttosto semplice. Il tuo codice sarebbe 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 + '\'' +
               '}';
   }
}
Tutto sembra andare bene, ma c'è un problema: puoi passare qualsiasi testo al costruttore della classe DayOfWeek . Ciò significa che qualcuno potrebbe creare un giorno della settimana chiamato "Frog", "Cloud" o "azaza322". Questo chiaramente non è il comportamento che ci aspettiamo, dato che ci sono solo 7 giorni reali della settimana e ognuno di essi ha un nome specifico. Pertanto, il nostro compito è limitare in qualche modo l'intervallo di valori possibili per la classe DayOfWeek . Prima che arrivasse Java 1.5, gli sviluppatori dovevano inventare autonomamente le proprie soluzioni a questo problema, poiché il linguaggio non aveva una soluzione già pronta. A quei tempi, se i programmatori avevano bisogno di limitare il numero di valori, facevano 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 + '\'' +
               '}';
   }
}
Ecco cosa dovresti notare:
  • Il costruttore è privato. Se un costruttore è contrassegnato con il modificatore private , non può essere utilizzato per creare un oggetto. E poiché la classe ha un solo costruttore, nessun oggetto DayOfWeek può mai essere creato.

    
    	public class Main {
    
       		public static void main(String[] args) {
          
           			DayOfWeek sunday = new DayOfWeek(); // Error!
       		}
    }
    

  • Naturalmente, la classe ha il numero richiesto di oggetti statici pubblici , che sono stati correttamente inizializzati (utilizzando i nomi corretti dei giorni della settimana).

    Ciò ha consentito a questi oggetti di essere utilizzati in altre classi.

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

    Produzione:

    Giornodellasettimana{title = 'domenica'}

Questo approccio risolve in gran parte il problema. Abbiamo a disposizione 7 giorni della settimana e nessuno può crearne di nuovi. Questa soluzione è stata offerta da Joshua Bloch nel suo libro Effective Java . A proposito, quel libro è molto interessante e una lettura obbligata per qualsiasi sviluppatore Java. Come usare la classe Enum - 2Con il rilascio di Java 1.5, il linguaggio ha ottenuto una soluzione già pronta per tali situazioni: Java Enums . Enum in Java è anche una classe. È appositamente "ottimizzato" per risolvere problemi come questo, ovvero creare un certo intervallo limitato di valori. I creatori di Java avevano già esempi pronti (ad esempio, C aveva già enum ), quindi sono stati in grado di creare la variante migliore.

Quindi cos'è Java Enum?

Rivisitiamo il nostro esempio DayOfWeek :

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Ora sembra molto più semplice :) Internamente, il nostro Enum ha 7 costanti statiche. Ed è qualcosa che possiamo usare per implementare un programma. Ad esempio, scriviamo un programma che determini se uno studente deve andare a scuola oggi. Il nostro studente avrà un programma giornaliero, rappresentato dalla classe StudentSchedule :

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
La variabile dayOfWeek dell'oggetto di pianificazione determina quale giorno è oggi. Ed ecco la nostra classe di studenti:

public class Student {

   private StudentSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {
      
       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep more!");
       } else {
           System.out.println("Damn, time for school again :(");
       }
   }
}
Nel metodo wakeUp() , usiamo Java Enum per determinare cosa dovrebbe fare lo studente dopo. Non abbiamo nemmeno fornito dettagli su ciascun campo in DayOfWeek e non è necessario: è ovvio come dovrebbero funzionare i giorni della settimana. Se lo usiamo nella sua forma attuale, qualsiasi sviluppatore capirebbe cosa sta succedendo nel nostro codice. Un altro esempio della convenienza di Enum è che le sue costanti possono essere utilizzate con l'istruzione switch. Ad esempio, scriviamo un programma per una dieta rigorosa, in cui i piatti sono programmati per giorno:

public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday Dinner! You can even enjoy something a little sweet today.");
               break;
           case MONDAY:
               System.out.println("Lunch for Monday: chicken noodle soup!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today it's celery soup :(");
               break;
               //... and so on to 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 su Enum ? Enum è una vera e propria classe con tutte le possibilità che questo comporta. Ad esempio, se l'attuale implementazione dei giorni della settimana è inadeguata, 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 + '\'' +
               '}';
   }
}
Ora le nostre costanti Enum hanno un campo title , un getter e un metodo toString sovrascritto . Rispetto alle classi normali, a Enum è stata posta una seria limitazione : non può essere ereditato. Inoltre, le enumerazioni hanno metodi caratteristici:
  • values() : restituisce un array di tutti i valori in Enum :

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

    Produzione:

    [DayOfWeek{title = 'Sunday'}, DayOfWeek{title = 'Lunedì'}, DayOfWeek{title = 'Tuesday'}, DayOfWeek{title = 'Wednesday'}, DayOfWeek{title = 'Thursday'}, DayOfWeek{title = 'venerdì'}, giorno della settimana{title = 'sabato'}]

  • ordinal() : restituisce il numero ordinale della costante. La numerazione parte da zero:

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

    Produzione:

    0

  • valueOf() : restituisce l' oggetto Enum che corrisponde al nome passato:

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

    Produzione:

    Giornodellasettimana{title = 'domenica'}

Nota:usiamo lettere maiuscole per specificare i campi Enum . Queste sono costanti, quindi usano tutte maiuscole anziché camelCase .
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION