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 + '\'' +
'}';
}
}
ทุกอย่างดูเหมือนจะดี แต่มีปัญหาอย่างหนึ่ง: คุณสามารถส่งข้อความใด ๆ ไปยังตัวสร้างของคลาสDayOfWeek นั่นหมายความว่าบางคนสามารถสร้างวันในสัปดาห์ชื่อ "Frog", "Cloud" หรือ "azaza322" นี่ไม่ใช่พฤติกรรมที่เราคาดไว้อย่างชัดเจน เนื่องจากมีเพียง 7 วันจริงในสัปดาห์ และแต่ละวันก็มีชื่อเฉพาะ ดังนั้น งานของเราคือการจำกัดช่วงของค่าที่เป็นไปได้สำหรับคลาสDayOfWeek ก่อนที่ Java 1.5 จะมาถึง นักพัฒนาต้องคิดค้นวิธีแก้ไขปัญหานี้ด้วยตนเอง เนื่องจากภาษาไม่มีวิธีแก้ไขสำเร็จรูป ในสมัยนั้น หากโปรแกรมเมอร์ต้องการจำกัดจำนวนค่า พวกเขาทำดังนี้
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 + '\'' +
'}';
}
}
นี่คือสิ่งที่คุณควรสังเกต:
-
ตัวสร้างเป็นแบบส่วนตัว หากคอนสตรัคเตอร์ถูกทำเครื่องหมายด้วย โมดิฟายเออ ร์ส่วนตัวจะไม่สามารถใช้สร้างอ็อบเจกต์ได้ และเนื่องจากคลาสมีตัวสร้างเพียงตัวเดียว จึงไม่สามารถสร้างออบเจกต์DayOfWeek ได้
public class Main { public static void main(String[] args) { DayOfWeek sunday = new DayOfWeek(); // Error! } }
-
แน่นอนว่าคลาสนี้มีจำนวน ออบเจกต์ สแตติกสาธารณะ ตามจำนวนที่ต้องการ ซึ่งเริ่มต้นอย่างถูกต้อง (โดยใช้ชื่อที่ถูกต้องของวันในสัปดาห์)
สิ่งนี้อนุญาตให้ใช้วัตถุเหล่านี้ในคลาสอื่น
public class Person { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
เอาท์พุต:
DayOfWeek{title = 'วันอาทิตย์'}

แล้ว Java Enum คืออะไร?
มาดู ตัวอย่าง DayOfWeek ของเรากันอีกครั้ง :
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
ตอนนี้มันดูง่ายขึ้นมาก :) ภายในEnum ของเรา มีค่าคงที่คงที่ 7 ค่า และนั่นคือสิ่งที่เราสามารถใช้เพื่อใช้งานโปรแกรมได้ ตัวอย่างเช่น ลองเขียนโปรแกรมที่กำหนดว่าวันนี้นักเรียนต้องไปโรงเรียนหรือไม่ นักเรียนของเราจะมีตารางประจำวัน ซึ่งแสดงโดย คลาส StudentSchedule :
public class StudentSchedule {
private DayOfWeek dayOfWeek;
// ... other fields
public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(DayOfWeek dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
}
ตัวแปร dayOfWeek ของอ็อบเจกต์กำหนดการกำหนดว่าวันนี้คือวันใด และนี่คือชั้นเรียนของนักเรียนของเรา:
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 :(");
}
}
}
ใน เมธอด WakeUp()เราใช้Java Enumเพื่อกำหนดว่านักเรียนควรทำอะไรต่อไป เราไม่ได้ให้รายละเอียดเกี่ยวกับแต่ละฟิลด์ในDayOfWeek ด้วย ซ้ำ และเราไม่จำเป็น: เห็นได้ชัดว่าวันในสัปดาห์ควรจะทำงานอย่างไร หากเราใช้ในรูปแบบปัจจุบัน นักพัฒนาทุกคนจะเข้าใจว่าเกิดอะไรขึ้นในโค้ดของเรา อีกตัวอย่างหนึ่งของความสะดวกของEnumคือสามารถใช้ค่าคงที่กับคำสั่ง switch ได้ ตัวอย่างเช่น มาเขียนโปรแกรมสำหรับการรับประทานอาหารที่เข้มงวด โดยกำหนดอาหารตามวัน:
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
}
}
}
นี่เป็นข้อได้เปรียบอย่างหนึ่งของEnumsที่เหนือกว่าโซลูชันเก่าที่ใช้ก่อน Java 1.5 — โซลูชันเก่าไม่สามารถใช้กับswitchได้ คุณต้องรู้อะไรอีกเกี่ยว กับEnum Enumเป็นคลาสจริงที่มีความเป็นไปได้ทั้งหมดที่เกี่ยวข้อง ตัวอย่างเช่น หากการใช้วันในสัปดาห์ปัจจุบันไม่เพียงพอ คุณสามารถเพิ่มตัวแปร ตัวสร้าง และเมธอดใน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 + '\'' +
'}';
}
}
ตอนนี้ค่าคงที่ Enum ของเรามี ฟิลด์ ชื่อ , getter และเมธอดtoStringที่ ถูกแทนที่ เมื่อเทียบกับคลาสปกติ Enumมีข้อจำกัดร้ายแรงอยู่ข้อหนึ่ง นั่นคือไม่สามารถสืบทอดได้ นอกจากนี้ การแจงนับยังมีวิธีการเฉพาะ:
-
ค่า () : คืนค่าอาร์เรย์ของค่าทั้งหมดในEnum :
public static void main(String[] args) { System.out.println(Arrays.toString(DayOfWeek.values())); }
เอาท์พุต:
[DayOfWeek{title = 'วันอาทิตย์'}, DayOfWeek{title = 'Monday'}, DayOfWeek{title = 'Tuesday'}, DayOfWeek{title = 'Wednesday'}, DayOfWeek{title = 'Thursday'}, DayOfWeek{title = 'วันศุกร์'} วันของสัปดาห์{title = 'วันเสาร์'}]
-
ordinal() : ส่งกลับจำนวนลำดับของค่าคงที่ การนับเริ่มต้นจากศูนย์:
public static void main(String[] args) { int sundayIndex = DayOfWeek.SUNDAY.ordinal(); System.out.println(sundayIndex); }
เอาท์พุต:
0
- valueOf() : ส่งคืน วัตถุ Enumที่สอดคล้องกับชื่อที่ส่งผ่าน:
public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY"); System.out.println(sunday); }
เอาท์พุต:
DayOfWeek{title = 'วันอาทิตย์'}
อ่านเพิ่มเติม: |
---|
GO TO FULL VERSION