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 + '\'' +
'}';
}
}
Úgy tűnik, minden rendben van, de van egy probléma: bármilyen szöveget átadhat a DayOfWeek osztály konstruktorának. Ez azt jelenti, hogy valaki létrehozhat egy "béka", "felhő" vagy "azaza322" nevű napot a héten. Nyilvánvalóan nem ezt a viselkedést várjuk el, mivel a hétnek csak 7 valódi napja van, és mindegyiknek külön neve van. Ezért az a feladatunk, hogy valamilyen módon korlátozzuk a DayOfWeek osztály lehetséges értéktartományát . A Java 1.5 megjelenése előtt a fejlesztőknek önállóan kellett kitalálniuk a saját megoldásaikat erre a problémára, mivel a nyelvnek nem volt kész megoldása. Abban az időben, ha a programozóknak korlátozniuk kellett az értékek számát, ezt tették:
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 + '\'' +
'}';
}
}
Íme, amit észre kell vennie:
-
A kivitelező magánszemély. Ha egy konstruktor meg van jelölve a privát módosítóval, akkor nem használható objektum létrehozására. És mivel az osztálynak csak egy konstruktora van, soha nem lehet DayOfWeek objektumot létrehozni.
public class Main { public static void main(String[] args) { DayOfWeek sunday = new DayOfWeek(); // Error! } }
-
Természetesen az osztályban van a szükséges számú nyilvános statikus objektum, amelyek helyesen lettek inicializálva (a hét napjainak megfelelő megnevezésével).
Ez lehetővé tette ezen objektumok más osztályokban való használatát.
public class Person { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
Kimenet:
DayOfWeek{title = 'vasárnap'}

Tehát mi az a Java Enum?
Nézzük újra a DayOfWeek példánkat:
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Ez most sokkal egyszerűbbnek tűnik :) Belsőleg az Enumunknak 7 statikus állandója van. És ez az, amit egy program megvalósítására használhatunk. Például írjunk egy programot, amely meghatározza, hogy egy tanulónak ma iskolába kell-e mennie. Diákunknak napirendje lesz, amelyet a StudentSchedule osztály képvisel:
public class StudentSchedule {
private DayOfWeek dayOfWeek;
// ... other fields
public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(DayOfWeek dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
}
Az ütemezési objektum dayOfWeek változója határozza meg, hogy melyik nap van ma. És íme a diákóránk:
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 :(");
}
}
}
A wakeUp() metódusban a Java Enum segítségével határozzuk meg, mit kell tennie a hallgatónak ezután. Nem is közöltünk részleteket a DayOfWeek egyes mezőiről , és nem is kell: nyilvánvaló, hogy a hét napjai hogyan működnek. Ha a jelenlegi formájában használjuk, minden fejlesztő megértené, mi történik a kódunkban. Egy másik példa az Enum kényelmére, hogy konstansai használhatók a switch utasítással. Például írjunk egy programot egy szigorú diétához, amelyben az ételeket napra ütemezzük:
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
}
}
}
Ez az Enums egyik előnye a Java 1.5 előtt használt régi megoldással szemben – a régi megoldást nem lehetett kapcsolóval használni . Mit kell még tudni az Enumról ? Az Enum egy igazi osztály, minden lehetőséggel, amit ez magában rejt. Ha például a hét napjainak jelenlegi megvalósítása nem megfelelő, akkor változókat, konstruktorokat és metódusokat adhat hozzá a DayOfWeek-hez :
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 + '\'' +
'}';
}
}
Most az Enum konstansaink tartalmaznak egy címmezőt , gettert és felülírt toString metódust. A normál osztályokhoz képest az Enum egy komoly korlátozást jelentett : nem örökölhető. Ezenkívül a felsorolásoknak jellegzetes módszerei vannak:
-
value() : az Enum összes értékének tömbjét adja vissza :
public static void main(String[] args) { System.out.println(Arrays.toString(DayOfWeek.values())); }
Kimenet:
[DayOfWeek{title = 'Vasárnap'}, DayOfWeek{title = 'Hétfő'}, DayOfWeek{title = 'Kedd'}, DayOfWeek{title = 'Szerda'}, DayOfWeek{title = 'Csütörtök'}, Daytle =Hét 'Péntek'}, DayOfWeek{title = 'Szombat'}]
-
ordinal() : az állandó sorszámát adja vissza. A számozás nulláról indul:
public static void main(String[] args) { int sundayIndex = DayOfWeek.SUNDAY.ordinal(); System.out.println(sundayIndex); }
Kimenet:
0
- valueOf() : az átadott névnek megfelelő Enum objektumot adja vissza:
public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY"); System.out.println(sunday); }
Kimenet:
DayOfWeek{title = 'vasárnap'}
További olvasnivalók: |
---|
GO TO FULL VERSION