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