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 + '\'' +
'}';
}
}
Alt ser ut til å være bra, men det er ett problem: du kan sende hvilken som helst tekst til konstruktøren av DayOfWeek- klassen. Det betyr at noen kan lage en ukedag kalt "Frog", "Cloud" eller "azaza322". Dette er tydeligvis ikke oppførselen vi forventer, siden det bare er 7 virkelige dager i uken, og hver av dem har et spesifikt navn. Derfor er oppgaven vår å begrense rekkevidden av mulige verdier for DayOfWeek -klassen. Før Java 1.5 kom, måtte utviklere selvstendig finne opp sine egne løsninger på dette problemet, siden språket ikke hadde en ferdig løsning. På den tiden, hvis programmerere trengte å begrense antall verdier, gjorde de dette:
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 + '\'' +
'}';
}
}
Her er hva du bør legge merke til:
-
Konstruktøren er privat. Hvis en konstruktør er merket med den private modifikatoren, kan den ikke brukes til å lage et objekt. Og siden klassen bare har én konstruktør, kan ingen DayOfWeek- objekter noen gang opprettes.
public class Main { public static void main(String[] args) { DayOfWeek sunday = new DayOfWeek(); // Error! } }
-
Selvfølgelig har klassen det nødvendige antallet offentlige statiske objekter, som ble korrekt initialisert (med de riktige navnene på ukedagene).
Dette gjorde at disse objektene kunne brukes i andre klasser.
public class Person { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
Produksjon:
DayOfWeek{title = 'søndag'}

Så hva er Java Enum?
La oss se på DayOfWeek- eksemplet vårt på nytt:
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Nå ser det mye enklere ut :) Internt har Enum 7 statiske konstanter. Og det er noe vi kan bruke det til å implementere et program. La oss for eksempel skrive et program som avgjør om en elev trenger å gå på skolen i dag. Vår student vil ha en daglig timeplan, representert av StudentSchedule- klassen:
public class StudentSchedule {
private DayOfWeek dayOfWeek;
// ... other fields
public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(DayOfWeek dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
}
Tidsplanobjektets dayOfWeek -variabel bestemmer hvilken dag som er i dag. Og her er studentklassen vår:
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 :(");
}
}
}
I wakeUp()- metoden bruker vi Java Enum for å bestemme hva studenten skal gjøre videre. Vi ga ikke engang detaljer om hvert felt i DayOfWeek , og det trenger vi ikke: det er åpenbart hvordan ukedagene skal fungere. Hvis vi bruker den i sin nåværende form, vil enhver utvikler forstå hva som skjer i koden vår. Et annet eksempel på bekvemmeligheten til Enum er at konstantene kan brukes med switch-setningen. La oss for eksempel skrive et program for en streng diett, der retter er planlagt etter dag:
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
}
}
}
Dette er en av Enums fordeler i forhold til den gamle løsningen som ble brukt før Java 1.5 — den gamle løsningen kunne ikke brukes med switch . Hva annet trenger du å vite om Enum ? Enum er en skikkelig klasse med alle de mulighetene dette innebærer. For eksempel, hvis gjeldende implementering av ukedagene er utilstrekkelig, kan du legge til variabler, konstruktører og metoder til 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 + '\'' +
'}';
}
}
Nå har våre Enum- konstanter et tittelfelt , getter og overstyrt toString -metode. Sammenlignet med vanlige klasser ble det satt en alvorlig begrensning på Enum - den kan ikke arves. I tillegg har oppregninger karakteristiske metoder:
-
values() : returnerer en matrise med alle verdiene i Enum :
public static void main(String[] args) { System.out.println(Arrays.toString(DayOfWeek.values())); }
Produksjon:
[DayOfWeek{title = 'Søndag'}, DayOfWeek{title = 'Mandag'}, DayOfWeek{title = 'Tuesday'}, DayOfWeek{title = 'Onsdag'}, DayOfWeek{title = 'Torsdag'}, DayOfWeek{title = 'Fredag'}, DayOfWeek{title = 'Lørdag'}]
-
ordinal() : returnerer ordenstallet til konstanten. Nummereringen starter fra null:
public static void main(String[] args) { int sundayIndex = DayOfWeek.SUNDAY.ordinal(); System.out.println(sundayIndex); }
Produksjon:
0
- valueOf() : returnerer Enum -objektet som tilsvarer det beståtte navnet:
public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY"); System.out.println(sunday); }
Produksjon:
DayOfWeek{title = 'søndag'}
GO TO FULL VERSION