CodeGym /จาวาบล็อก /สุ่ม /คลาส Enum ใน Java
John Squirrels
ระดับ
San Francisco

คลาส Enum ใน Java

เผยแพร่ในกลุ่ม
สวัสดี! ในบทความนี้ เราจะบอกคุณเกี่ยวกับJava Enums ลองจินตนาการว่าคุณได้รับงานต่อไปนี้: สร้างคลาสที่ใช้วันในสัปดาห์ เมื่อมองแวบแรก ดูเหมือนว่าจะค่อนข้างตรงไปตรงมา รหัสของคุณจะมีลักษณะดังนี้:

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 = 'วันอาทิตย์'}

วิธีการนี้ช่วยแก้ปัญหาได้อย่างมาก เรามีวันทั้ง 7 วันในหนึ่งสัปดาห์ และไม่มีใครสามารถสร้างวันใหม่ได้ โซลูชันนี้นำเสนอโดย Joshua Bloch ในหนังสือของเขาEffective Java ยังไงก็ตาม หนังสือเล่มนั้นเจ๋งมากและต้องอ่านสำหรับนักพัฒนา Java ทุกคน วิธีใช้คลาส Enum - 2ด้วยการเปิดตัว Java 1.5 ทำให้ภาษาได้รับโซลูชันสำเร็จรูปสำหรับสถานการณ์ดังกล่าว: Java Enums Enum ใน Javaก็เป็นคลาสเช่นกัน มันถูก "ปรับแต่ง" เป็นพิเศษเพื่อแก้ปัญหาเช่นนี้ นั่นคือการสร้างช่วงของค่าที่จำกัด ผู้สร้าง Java มีตัวอย่างพร้อมอยู่แล้ว (เช่น C มีenum แล้ว ) ดังนั้นพวกเขาจึงสามารถสร้างตัวแปรที่ดีที่สุดได้

แล้ว 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 = 'วันอาทิตย์'}

บันทึก:เราใช้ตัวพิมพ์ใหญ่เพื่อระบุฟิลด์Enum สิ่งเหล่านี้เป็นค่าคงที่ ดังนั้นพวกเขาจึงใช้ตัว พิมพ์ ใหญ่ทั้งหมดแทนcamelCase
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION