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 + '\'' +
'}';
}
}
Semuanya nampak baik-baik saja, tetapi terdapat satu masalah: anda boleh menghantar sebarang teks kepada pembina kelas DayOfWeek . Ini bermakna seseorang boleh membuat hari dalam seminggu yang dinamakan "Frog", "Cloud" atau "azaza322". Ini jelas bukan tingkah laku yang kami jangkakan, kerana hanya terdapat 7 hari sebenar dalam seminggu, dan setiap daripadanya mempunyai nama tertentu. Oleh itu, tugas kami adalah untuk mengehadkan julat nilai yang mungkin untuk kelas DayOfWeek . Sebelum Java 1.5 datang, pembangun perlu mencipta penyelesaian mereka sendiri untuk masalah ini secara bebas, kerana bahasa itu tidak mempunyai penyelesaian siap sedia. Pada masa itu, jika pengaturcara perlu mengehadkan bilangan nilai, mereka melakukan ini:
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 + '\'' +
'}';
}
}
Inilah yang anda patut perhatikan:
-
Pembina adalah peribadi. Jika pembina ditandakan dengan pengubah suai peribadi , ia tidak boleh digunakan untuk mencipta objek. Dan kerana kelas hanya mempunyai satu pembina, tiada objek DayOfWeek boleh dibuat.
public class Main { public static void main(String[] args) { DayOfWeek sunday = new DayOfWeek(); // Error! } }
-
Sudah tentu, kelas itu mempunyai bilangan objek statik awam yang diperlukan , yang dimulakan dengan betul (menggunakan nama yang betul untuk hari dalam seminggu).
Ini membenarkan objek ini digunakan dalam kelas lain.
public class Person { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
Pengeluaran:
DayOfWeek{title = 'Ahad'}

Jadi apa itu Java Enum?
Mari lihat semula contoh DayOfWeek kami:
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Sekarang ia kelihatan lebih mudah :) Secara dalaman, Enum kami mempunyai 7 pemalar statik. Dan itu adalah sesuatu yang boleh kita gunakan untuk melaksanakan program. Sebagai contoh, mari kita tulis program yang menentukan sama ada pelajar perlu pergi ke sekolah hari ini. Pelajar kami akan mempunyai jadual harian, diwakili oleh kelas StudentSchedule :
public class StudentSchedule {
private DayOfWeek dayOfWeek;
// ... other fields
public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(DayOfWeek dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
}
Pembolehubah dayOfWeek objek jadual menentukan hari hari ini. Dan inilah kelas pelajar kami:
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 :(");
}
}
}
Dalam kaedah wakeUp() , kami menggunakan Java Enum untuk menentukan perkara yang perlu dilakukan oleh pelajar seterusnya. Kami tidak memberikan butiran tentang setiap medan dalam DayOfWeek , dan kami tidak perlu: jelas sekali cara hari dalam seminggu berfungsi. Jika kami menggunakannya dalam bentuk semasa, mana-mana pembangun akan memahami apa yang berlaku dalam kod kami. Satu lagi contoh kemudahan Enum ialah pemalarnya boleh digunakan dengan pernyataan suis. Sebagai contoh, mari kita tulis program untuk diet yang ketat, di mana hidangan dijadualkan mengikut hari:
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
}
}
}
Ini adalah salah satu kelebihan Enums berbanding penyelesaian lama yang digunakan sebelum Java 1.5 — penyelesaian lama tidak boleh digunakan dengan suis . Apa lagi yang anda perlu tahu tentang Enum ? Enum ialah kelas sebenar dengan semua kemungkinan yang diperlukan. Sebagai contoh, jika pelaksanaan semasa hari dalam seminggu tidak mencukupi, anda boleh menambah pembolehubah, pembina dan kaedah pada 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 + '\'' +
'}';
}
}
Sekarang pemalar Enum kami mempunyai medan tajuk , pengambil dan kaedah toString yang diganti. Berbanding dengan kelas biasa, satu had serius diletakkan pada Enum — ia tidak boleh diwarisi. Selain itu, penghitungan mempunyai kaedah ciri:
-
values() : mengembalikan tatasusunan semua nilai dalam Enum :
public static void main(String[] args) { System.out.println(Arrays.toString(DayOfWeek.values())); }
Pengeluaran:
[DayOfWeek{title = 'Ahad'}, DayOfWeek{title = 'Isnin'}, DayOfWeek{title = 'Selasa'}, DayOfWeek{title = 'Rabu'}, DayOfWeek{title = 'Khamis'}, DayOfWeek{title = 'Jumaat'}, DayOfWeek{title = 'Sabtu'}]
-
ordinal() : mengembalikan nombor ordinal pemalar. Penomboran bermula dari sifar:
public static void main(String[] args) { int sundayIndex = DayOfWeek.SUNDAY.ordinal(); System.out.println(sundayIndex); }
Pengeluaran:
0
- valueOf() : mengembalikan objek Enum yang sepadan dengan nama yang diluluskan:
public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY"); System.out.println(sunday); }
Pengeluaran:
DayOfWeek{title = 'Ahad'}
Bacaan lanjut: |
---|
GO TO FULL VERSION