Kiểu dữ liệu enum trong Java

Đây là bài 38/62 bài của series môn học Ngôn ngữ lập trình Java

Bài này sẽ giới thiệu đến các bạn kiểu dữ liệu enum trong Java. Chúng ta đã từng tìm hiểu Kiểu dữ liệu enum trong C++. Các bạn có thể đọc thêm để tham khảo nhé.

1. Kiểu dữ liệu enum trong Java là gì?

Trong Java, enum là một kiểu dữ liệu bao gồm tập hợp các các giá trị hằng không đổi (enum constant). Chúng ta sử dụng từ khóa enum để khai báo một kiểu dữ liệu enum. Ví dụ:

enum Size { 
   SMALL, MEDIUM, LARGE, EXTRALARGE 
}

Trong ví dụ trên, chúng ta có 1 kiểu enum tên là Size. Nó bao gồm các giá trị không đổi là SMALL, MEDIUM, LARGEEXTRALARGE trong dấu ngoặc nhọn {}. Các giá trị hằng không đổi thường được viết hoa.

Chúng ta có thể tạo một biến kiểu dữ liệu enum và sử dụng toán tử chấm (.) để truy xuất các giá trị không đổi thuộc kiểu dữ liệu enum.

enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
}

class Main {
    public static void main(String[] args) {
        Size s1 = Size.LARGE;
        Size s2 = Size.SMALL;
        System.out.println(s1);
        System.out.println(s2);
    }
}
Kết quả
LARGE
SMALL

Lưu ý: Nếu sử dụng tên enum Size truy xuất giá trị hằng không tồn tại trong Size thì sẽ gây ra lỗi.

Size s3 = Size.SMALLEST;//error cannot find symbol variable SMALLEST

2. Enum class trong Java

Trong Java, kiểu dữ liệu enum có thể được xem như là một lớp đặc biệt. Một lớp enum có thể bao gồm những thuộc tính và phương thức giống như một lớp bình thường.

Khi chúng ta tạo một lớp enum thì trình biên dịch sẽ tự động tạo các đối tượng chính là các giá trị không đổi của enum. Tất cả các đối tượng này mặc định được trình biên dịch xác định khai báo là public static final. Ví dụ:

enum Size{
  SMALL, MEDIUM, LARGE, EXTRALARGE;

    public String getSize() {
        switch(this) {
            case SMALL:
              return "small";
            case MEDIUM:
              return "medium";
            case LARGE:
              return "large";
            case EXTRALARGE:
              return "extra large";
            default:
              return null;
        }
    }
}
class Main{
    public static void main(String[] args) {
        //gọi hàm getSize() sử dụng đối tượng SMALL của enum Size
        System.out.println("The size of the pizza is " + Size.SMALL.getSize());
    }
}
Kết quả
The size of the pizza is small

Trong ví dụ trên, lớp enum Size được tạo ra. Lớp này tự động được trình biên dịch tạo ra có 4 đối tượng là SMALL, MEDIUM, LARGEEXTRALARGE. Các đối tượng này có thể gọi hàm getSize() thuộc lớp enum để sử dụng.

Các phương thức của lớp enum

Giả sử, chúng ta có lớp enum sau:

enum Size{
  SMALL, MEDIUM, LARGE, EXTRALARGE;
  public void displayInfo(){
      System.out.println(SMALL + ", " + MEDIUM + ", " + LARGE + ", " + EXTRALARGE);
  }
}

Trong Java, một số phương thức đã được định nghĩa sẵn trong lớp enum để sử dụng.

Hàm ordinal()

Trả về vị trí của giá trị không đổi trong enum.

Size s1 = Size.MEDIUM;
System.out.println(s1.ordinal());//1
Hàm compareTo()

Trả về kết quả so sánh vị trí của các giá trị không đổi trong enum.

System.out.println(Size.SMALL.compareTo(Size.MEDIUM));//-1
System.out.println(Size.EXTRALARGE.compareTo(Size.SMALL));//3
Hàm toString()

Trả về một chuỗi đại diện cho các giá trị không đổi trong enum.

System.out.println(Size.SMALL.toString());//SMALL
System.out.println(Size.EXTRALARGE.toString());//EXTRALARGE

Chúng ta có thể thay đổi chuỗi mặc định đại diện cho các enum constant.

enum Size {
   SMALL {
      //ghi đè hàm toString() cho enum constant SMALL
      @Override
      public String toString() {
        return "The size is small.";
      }
   },

   MEDIUM {
     //ghi đè hàm toString() cho enum constant MEDIUM
      @Override
      public String toString() {
        return "The size is medium.";
      }
   };
}

class Main {
   public static void main(String[] args) {
      System.out.println(Size.MEDIUM.toString());//The size is medium.
   }
}
Hàm name()

Trả về tên được định nghĩa trong enum của các giá trị không đổi.

Size s1 = Size.MEDIUM;
System.out.println(s1.name());//MEDIUM
Hàm valueOf()

Trả về một chuỗi có cùng tên với các giá trị không đổi trong enum.

System.out.println(Size.valueOf("SMALL"));//SMALL
System.out.println(Size.valueOf("SMALLEST"));//lỗi no enum constant Size.SMALLEST
Hàm values()

Trả về một mảng chứa các giá trị không đổi trong enum.

Size[] enumArray = Size.values();
for(Size s:enumArray){
	System.out.println(s);

/*Kết quả xuất ra là
SMALL
MEDIUM
LARGE
EXTRALARGE*/
}

3. Enum constructor trong Java

Trong Java, một lớp enum cũng có thể có hàm khởi tạo giống như một lớp bình thường. Có 2 loại hàm khởi tạo của một lớp enum:

  • private chỉ được truy cập trong lớp enum
  • mặc định (default) chỉ được truy cập trong package chứa lớp enum

Ví dụ:

enum Size {
    //enum constants gọi hàm khởi tạo private
    SMALL("The size is small."),
    MEDIUM("The size is medium."),
    LARGE("The size is large."),
    EXTRALARGE("The size is extra large.");
    private final String cakeSize;
    //hàm khởi tạo private trong enum
    private Size(String pizzaSize) {
       this.cakeSize = pizzaSize;
    }
    public String getSize() {
       return cakeSize;
    }
}

class Main {
    public static void main(String[] args) {
        Size size = Size.SMALL;
        System.out.println(size.getSize());
    }
}
Kết quả
The size is small.

Trong ví dụ trên, hàm khởi tạo của lớp enum Size khai báo private nên chỉ được gọi trong lớp Size. Các hằng trong enum gọi hàm khởi tạo của lớp enum Size:

SMALL("The size is small."),
MEDIUM("The size is medium."),
LARGE("The size is large."),
EXTRALARGE("The size is extra large.");

Trong lớp Main, chúng ta gán Size.SMALL cho một biến có kiểu enum Size. Hằng SMALL đã gọi hàm khởi tạo của Size.

5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Xây dựng Singleton class trong JavaCác loại ngoại lệ (exceptions) trong Java >>
Chia sẻ trên mạng xã hội:

Tác giả Vinh Lê

Vinh Lê hiện đang là biên tập viên tại Góc Học IT.

Bài viết của Vinh Lê

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.