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 + '\'' +
'}';
}
}
และดูเหมือนทุกอย่างจะเรียบร้อยดี แต่มีปัญหาอยู่อย่างหนึ่งคือคุณสามารถส่งข้อความใดๆ ไปยัง Constructor ของคลาส DayOfWeek ได้ ด้วยวิธีนี้ ผู้ใช้จะสามารถสร้างวันในสัปดาห์ "กบ" "คลาวด์" หรือ "azaza322" ได้ เห็นได้ชัดว่านี่ไม่ใช่พฤติกรรมที่เราคาดหวัง เนื่องจากมีเพียง 7 วันจริงในสัปดาห์ และแต่ละวันก็มีชื่อ ดังนั้นงานของเราคือการจำกัดช่วงของค่าที่เป็นไปได้สำหรับคลาส " วันในสัปดาห์ " ก่อน 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 Man { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
บทสรุป:
วันแห่งสัปดาห์{title='วันอาทิตย์'}

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