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'}

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'}
Altre letture: |
---|
GO TO FULL VERSION