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 + '\'' +
'}';
}
}
Dan semuanya kelihatan baik-baik saja, tetapi terdapat satu masalah: anda boleh menghantar sebarang teks kepada pembina kelas DayOfWeek . Dengan cara ini, seseorang boleh mencipta hari dalam minggu "Frog", "Cloud" atau "azaza322". Ini jelas bukan tingkah laku yang kita harapkan, kerana hanya terdapat 7 hari sebenar dalam seminggu, dan setiap daripada mereka mempunyai nama. Oleh itu, tugas kami adalah untuk mengehadkan julat nilai yang mungkin untuk kelas " hari dalam seminggu ". Sebelum Java 1.5, pembangun terpaksa menghasilkan penyelesaian kepada masalah ini sendiri, kerana tiada penyelesaian siap sedia dalam bahasa itu sendiri. Pada masa itu, jika keadaan memerlukan bilangan nilai yang terhad, 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 + '\'' +
'}';
}
}
Perkara yang perlu anda perhatikan di sini:
-
Pembina persendirian. Jika pembina ditandakan dengan pengubah suai peribadi , objek kelas tidak boleh dibuat menggunakan pembina itu. Dan kerana terdapat hanya satu pembina dalam kelas ini, objek DayOfWeek tidak boleh dibuat sama sekali.
public class Main { public static void main(String[] args) { DayOfWeek sunday = new DayOfWeek();//error! } }
-
Pada masa yang sama, kelas mengandungi bilangan objek statik awam yang diperlukan yang dimulakan mengikut cara yang kami perlukan (nama hari adalah betul).
Ini memungkinkan untuk menggunakan objek dalam kelas lain.
public class Man { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
Kesimpulan:
DayOfWeek{title='Ahad'}
Apakah enum?
Jadi, apakah Enum dalam Java ? Mari kita lihat contoh DayOfWeek yang sama :public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Ia sudah kelihatan lebih mudah :) Di dalam Enum kami terdapat 7 pemalar dengan akses statik. Kita sudah boleh menggunakannya untuk melaksanakan logik dalam program. Sebagai contoh, mari kita tulis program yang akan menentukan sama ada pelajar perlu pergi ke sekolah hari ini. Pelajar kami akan mempunyai rutin hariannya sendiri, yang ditetapkan oleh kelas ScholarSchedule :
public class ScholarSchedule {
private DayOfWeek dayOfWeek;
//...other fields
public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(DayOfWeek dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
}
Pembolehubah dayOfWeek dalam mod hari menentukan hari itu. Dan inilah kelas pelajar kami:
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 :(");
}
}
}
Dalam kaedah wakeUp() , menggunakan Enum, kami menentukan tindakan selanjutnya pelajar. Kami tidak menerangkan secara terperinci maksud setiap pembolehubah dalam DayOfWeek , dan ini tidak perlu: mekanisme hari dalam seminggu sudah jelas, dan jika kami menggunakannya dalam bentuk semasa, mana-mana pembangun akan memahami apa sedang berlaku dalam kod anda. Satu lagi contoh kemudahan Enum ialah pemalarnya boleh digunakan dengan pernyataan suis . Sebagai contoh, kami sedang menulis program untuk diet yang ketat, di mana makanan dijadualkan mengikut hari:
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
}
}
}
Ini adalah salah satu kelebihan Enum berbanding penyelesaian lama yang digunakan sebelum Java 1.5: penyelesaian lama tidak boleh digunakan dengan suis .
Apa lagi yang anda perlu tahu tentang kelas Enum?
Kelas Enum ialah kelas sebenar dengan semua keupayaan yang disertakan dengannya. Sebagai contoh, jika pelaksanaan semasa hari dalam seminggu tidak mencukupi untuk anda, 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 + '\'' +
'}';
}
}
Pemalar Enum kami kini mempunyai medan tajuk , pengambil dan kaedah toString yang diganti . Berbanding dengan kelas biasa, Enum mempunyai satu had yang serius - ia tidak boleh diwarisi. Di samping itu, penghitungan mempunyai kaedah unik untuk mereka:
-
values() : mengembalikan tatasusunan semua nilai yang disimpan dalam Enum :
public static void main(String[] args) { System.out.println(Arrays.toString(DayOfWeek.values())); }
Kesimpulan:
[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. Kira detik bermula dari sifar:
public static void main(String[] args) { int sundayIndex = DayOfWeek.SUNDAY.ordinal(); System.out.println(sundayIndex); }
Kesimpulan:
0
- valueOf() : Mengembalikan objek Enum yang sepadan dengan nama yang diberikan:
public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY"); System.out.println(sunday); }
Kesimpulan:
DayOfWeek{title='Ahad'}
GO TO FULL VERSION