JavaRush /Blog Java /Random-VI /Enum trong Java: Cách sử dụng lớp

Enum trong Java: Cách sử dụng lớp

Xuất bản trong nhóm
Xin chào! Trong bài viết này tôi sẽ cho bạn biết về Java Enums. Hãy tưởng tượng bạn được giao một nhiệm vụ: tạo một lớp thực hiện các ngày trong tuần . Thoạt nhìn, điều này không có gì phức tạp và mã của bạn sẽ trông giống như thế này:
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 + '\'' +
               '}';
   }
}
Và mọi thứ có vẻ ổn, nhưng có một vấn đề: bạn có thể chuyển bất kỳ văn bản nào tới hàm tạo của lớp DayOfWeek . Bằng cách này, ai đó có thể tạo ngày trong tuần "Ếch", "Đám mây" hoặc "azaza322". Đây rõ ràng không phải là hành vi mà chúng ta mong đợi, vì chỉ có 7 ngày thực trong tuần và mỗi ngày đều có một tên. Do đó, nhiệm vụ của chúng ta là bằng cách nào đó hạn chế phạm vi giá trị có thể có cho lớp “ ngày trong tuần “. Trước Java 1.5, các nhà phát triển buộc phải tự mình đưa ra giải pháp cho vấn đề này vì bản thân ngôn ngữ này không có giải pháp sẵn có. Vào thời đó, nếu tình huống yêu cầu một số lượng giá trị hạn chế, họ sẽ làm như sau:
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 + '\'' +
               '}';
   }
}
Điều bạn nên chú ý ở đây:
  • Nhà xây dựng tư nhân. Nếu một hàm tạo được đánh dấu bằng công cụ sửa đổi riêng , thì không thể tạo một đối tượng của lớp bằng hàm tạo đó. Và vì chỉ có một hàm tạo trong lớp này nên không thể tạo đối tượng DayOfWeek .

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • Đồng thời, lớp này chứa số lượng đối tượng tĩnh công khai cần thiết đã được khởi tạo theo cách chúng ta cần (tên của các ngày là chính xác).

    Điều này làm cho nó có thể sử dụng các đối tượng trong các lớp khác.

    public class Man {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }

    Phần kết luận:

    Ngày trong tuần{title='Chủ nhật'}

Cách tiếp cận này phần lớn cho phép chúng tôi giải quyết vấn đề. Chúng ta có 7 ngày trong tuần tùy ý sử dụng và không ai có thể tạo ra những ngày mới. Giải pháp này được Joshua Bloch đề xuất trong cuốn sách Java hiệu quả . Nhân tiện, cuốn sách này rất hay và phải đọc đối với bất kỳ nhà phát triển Java nào.
Cách sử dụng lớp Enum - 2
Với việc phát hành Java 1.5, ngôn ngữ này đã giới thiệu một giải pháp có sẵn cho những tình huống như vậy - phép liệt kê Enum . Enum cũng là một lớp. Nhưng nó được “điều chỉnh” đặc biệt để giải quyết các vấn đề tương tự như vấn đề của chúng ta: tạo ra một phạm vi giá trị giới hạn nhất định. Vì những người tạo ra Java đã có sẵn các ví dụ (ví dụ: ngôn ngữ C, trong đó Enum đã tồn tại), nên họ có thể tạo ra tùy chọn tối ưu.

enum là gì?

Vậy Enum trong Java là gì ? Hãy xem ví dụ về DayOfWeek tương tự :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Nó trông đơn giản hơn nhiều :) Bên trong Enum của chúng tôi có 7 hằng số có quyền truy cập tĩnh. Chúng ta đã có thể sử dụng nó để triển khai logic trong chương trình. Ví dụ: hãy viết một chương trình xác định xem hôm nay một học sinh có cần đến trường hay không. Học sinh của chúng ta sẽ có thói quen hàng ngày của riêng mình, được chỉ định bởi lớp ScholarSchedule :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Biến dayOfWeek trong chế độ ngày xác định hôm nay là ngày thứ mấy. Và đây là lớp học của học sinh chúng tôi:
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 :(");
       }
   }
}
Trong phương thức WakeUp() , sử dụng Enum, chúng tôi xác định các hành động tiếp theo của học sinh. Chúng tôi thậm chí còn không mô tả chi tiết từng biến trong DayOfWeek nghĩa là gì và điều này là không cần thiết: ​​cơ chế của các ngày trong tuần đã rõ ràng và nếu chúng tôi sử dụng nó ở dạng hiện tại, bất kỳ nhà phát triển nào cũng sẽ hiểu điều gì đang xảy ra trong mã của bạn. Một ví dụ khác về sự tiện lợi của Enum là các hằng số của nó có thể được sử dụng với câu lệnh switch . Ví dụ: chúng tôi đang viết một chương trình cho một chế độ ăn kiêng nghiêm ngặt, trong đó các bữa ăn được lên lịch theo ngày:
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
       }
   }
}
Đây là một trong những ưu điểm của Enum so với giải pháp cũ đã được sử dụng trước Java 1.5: giải pháp cũ không thể sử dụng được với switch .

Bạn còn cần biết gì nữa về lớp Enum?

Lớp Enum là một lớp thực sự với tất cả các khả năng đi kèm với nó. Ví dụ: nếu việc triển khai các ngày trong tuần hiện tại là không đủ đối với bạn, bạn có thể thêm các biến, hàm tạo và phương thức vào 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 + '\'' +
               '}';
   }
}
Các hằng số Enum của chúng ta hiện có trường tiêu đề , phương thức getter và phương thức toString được ghi đè . So với các lớp thông thường, Enum có một hạn chế nghiêm trọng - nó không thể kế thừa được. Ngoài ra, bảng liệt kê có các phương thức riêng cho chúng:
  • value() : trả về một mảng gồm tất cả các giá trị được lưu trong Enum :

    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }

    Phần kết luận:

    [DayOfWeek{title='Sunday'}, DayOfWeek{title='Monday'}, DayOfWeek{title='Tuesday'}, DayOfWeek{title='Wednesday'}, DayOfWeek{title='Thursday'}, DayOfWeek{title= 'Thứ Sáu'}, DayOfWeek{title='Thứ Bảy'}]

  • ordinal() : trả về số thứ tự của một hằng số. Việc đếm ngược bắt đầu từ số 0:

    public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }

    Phần kết luận:

    0

  • valueOf() : Trả về một đối tượng Enum tương ứng với tên đã cho:

    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }

    Phần kết luận:

    Ngày trong tuần{title='Chủ nhật'}

Chú ý:Chúng tôi viết hoa tên của các phần tử Enum vì chúng là hằng số và được chỉ định là hằng số chứ không phải CamelCase .
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION