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 + '\'' +
'}';
}
}
Totul pare să fie în regulă, dar există o problemă: puteți trece orice text constructorului clasei DayOfWeek . Asta înseamnă că cineva ar putea crea o zi a săptămânii numită „Broacă”, „Nor” sau „azaza322”. În mod clar, acesta nu este comportamentul la care ne așteptăm, deoarece există doar 7 zile reale pe săptămână și fiecare dintre ele are un nume specific. Prin urmare, sarcina noastră este să limităm cumva gama de valori posibile pentru clasa DayOfWeek . Înainte de apariția Java 1.5, dezvoltatorii au trebuit să-și inventeze în mod independent propriile soluții la această problemă, deoarece limbajul nu avea o soluție gata făcută. În acele zile, dacă programatorii trebuiau să limiteze numărul de valori, făceau asta:
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 + '\'' +
'}';
}
}
Iată ce ar trebui să observați:
-
Constructorul este privat. Dacă un constructor este marcat cu modificatorul privat , acesta nu poate fi folosit pentru a crea un obiect. Și, deoarece clasa are un singur constructor, niciun obiect DayOfWeek nu poate fi creat vreodată.
public class Main { public static void main(String[] args) { DayOfWeek sunday = new DayOfWeek(); // Error! } }
-
Desigur, clasa are numărul necesar de obiecte statice publice , care au fost inițializate corect (folosind numele corecte ale zilelor săptămânii).
Acest lucru a permis ca aceste obiecte să fie folosite în alte clase.
public class Person { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
Ieșire:
Ziua Săptămânii{title = 'Duminică'}

Deci, ce este Java Enum?
Să revedem exemplul nostru DayOfWeek :
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Acum pare mult mai simplu :) Pe plan intern, Enum- ul nostru are 7 constante statice. Și asta e ceva pe care îl putem folosi pentru a implementa un program. De exemplu, să scriem un program care determină dacă un elev trebuie să meargă astăzi la școală. Studentul nostru va avea un program zilnic, reprezentat de clasa StudentSchedule :
public class StudentSchedule {
private DayOfWeek dayOfWeek;
// ... other fields
public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(DayOfWeek dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
}
Variabila dayOfWeek a obiectului de planificare determină ziua care este astăzi. Și iată clasa noastră de studenți:
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 :(");
}
}
}
În metoda wakeUp() , folosim Java Enum pentru a determina ce ar trebui să facă studentul în continuare. Nici măcar nu am oferit detalii despre fiecare câmp din DayOfWeek și nu este nevoie: este evident cum ar trebui să funcționeze zilele săptămânii. Dacă îl folosim în forma sa actuală, orice dezvoltator ar înțelege ce se întâmplă în codul nostru. Un alt exemplu de comoditate a lui Enum este că constantele sale pot fi utilizate cu instrucțiunea switch. De exemplu, să scriem un program pentru o dietă strictă, în care felurile de mâncare sunt programate pe zi:
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
}
}
}
Acesta este unul dintre avantajele Enums față de vechea soluție folosită înainte de Java 1.5 — vechea soluție nu putea fi utilizată cu switch . Ce altceva trebuie să știi despre Enum ? Enum este o adevărată clasă cu toate posibilitățile pe care aceasta le presupune. De exemplu, dacă implementarea curentă a zilelor săptămânii este inadecvată, puteți adăuga variabile, constructori și metode la 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 + '\'' +
'}';
}
}
Acum constantele noastre Enum au un câmp de titlu , getter și metoda toString suprascrisă. În comparație cu clasele obișnuite, o limitare serioasă a fost pusă pe Enum - nu poate fi moștenită. În plus, enumerările au metode caracteristice:
-
values() : returnează o matrice a tuturor valorilor din Enum :
public static void main(String[] args) { System.out.println(Arrays.toString(DayOfWeek.values())); }
Ieșire:
[DayOfWeek{title = 'Sunday'}, DayOfWeek{title = 'Monday'}, DayOfWeek{title = 'Tuesday'}, DayOfWeek{title = 'Wednesday'}, DayOfWeek{title = 'Thursday'}, DayOfWeek{title = „Friday”}, DayOfWeek{title = „Sâmbătă”}]
-
ordinal() : returnează numărul ordinal al constantei. Numerotarea începe de la zero:
public static void main(String[] args) { int sundayIndex = DayOfWeek.SUNDAY.ordinal(); System.out.println(sundayIndex); }
Ieșire:
0
- valueOf() : returnează obiectul Enum care corespunde numelui transmis:
public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY"); System.out.println(sunday); }
Ieșire:
Ziua Săptămânii{title = 'Duminică'}
Mai multe lecturi: |
---|
GO TO FULL VERSION