JavaRush /จาวาบล็อก /Random-TH /Enum ใน Java: วิธีใช้คลาส

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 + '\'' +
               '}';
   }
}
และดูเหมือนทุกอย่างจะเรียบร้อยดี แต่มีปัญหาอยู่อย่างหนึ่งคือคุณสามารถส่งข้อความใดๆ ไปยัง 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='วันอาทิตย์'}

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

อีนัมคืออะไร?

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

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