Java: enum trong Java

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Trong bài hướng dẫn này, chúng ta sẽ tìm hiểu về enum trong Java. Chúng ta sẽ học cách tạo và sử dụng enum và các lớp enum với sự trợ giúp của các ví dụ.

Trong Java, enum (viết tắt của enumeration) là một kiểu có một tập hợp các giá trị không đổi cố định. Chúng ta sử dụng từ khóa enum để khai báo enum.

Ví dụ:

enum Size { 
   SMALL, MEDIUM, LARGE, EXTRALARGE 
}

Ở đây, chúng ta đã tạo một enum có tên Size. Nó chứa các giá trị cố định SMALL, MEDIUM, LARGE, EXTRALARGE.

Những giá trị bên trong dấu ngoặc nhọn này được gọi là hằng enum (giá trị).

Lưu ý: Hằng enum thường được biểu diễn bằng chữ hoa.

Ví dụ 1: Java Enum

enum Size {
   SMALL, MEDIUM, LARGE, EXTRALARGE
}

class Main {
   public static void main(String[] args) {
      System.out.println(Size.SMALL);
      System.out.println(Size.MEDIUM);
   }
}

Kết quả:

SMALL
MEDIUM

Như chúng ta có thể thấy từ ví dụ trên, chúng ta sử dụng tên enum để truy cập các giá trị hằng.

Ngoài ra, chúng ta có thể tạo các biến kiểu enum.

Ví dụ:

Size pizzaSize;

Ở đây, pizzaSize là một biến có kiểu Size. Nó chỉ có thể được gán với 4 giá trị.

pizzaSize = Size.SMALL;
pizzaSize = Size.MEDIUM;
pizzaSize = Size.LARGE;
pizzaSize = Size.EXTRALARGE;

Ví dụ 2: Java Enum với câu lệnh switch

enum Size {
 SMALL, MEDIUM, LARGE, EXTRALARGE
}

class Test {
 Size pizzaSize;
 public Test(Size pizzaSize) {
   this.pizzaSize = pizzaSize;
 }
 public void orderPizza() {
   switch(pizzaSize) {
     case SMALL:
       System.out.println("I ordered a small size pizza.");
       break;
     case MEDIUM:
       System.out.println("I ordered a medium size pizza.");
       break;
     default:
       System.out.println("I don't know which one to order.");
       break;
   }
 }
}

class Main {
 public static void main(String[] args) {
   Test t1 = new Test(Size.MEDIUM);
   t1.orderPizza();
 }
}

Kết quả:

I ordered a medium size pizza.

Trong chương trình trên, chúng ta đã tạo một kiểu enum có tên Size. Sau đó, chúng ta đã khai báo một biến tên pizzaSize với kiểu Size.

Ở đây, biến pizzaSize chỉ có thể được gán với 4 giá trị (SMALL, MEDIUM, LARGE, EXTRALARGE).

Lưu ý lệnh sau:

Test t1 = new Test(Size.MEDIUM);

Nó sẽ gọi đến hàm tạo Test() của lớp Test. Bây giờ, biến pizzaSize được chỉ định là hằng MEDIUM.

Dựa trên giá trị, một trong các trường hợp của câu lệnh switch case sẽ được thực thi.

Enum Class trong Java

Trong Java, enum được coi là một kiểu lớp đặc biệt. Nó được giới thiệu từ phiên bản Java 5.

Một lớp enum có thể bao gồm các phương thức và trường giống như các lớp thông thường.

enum Size {
    constant1, constant2, …, constantN;

    // phương thức và thuộc tính	
}

Khi ta tạo một lớp enum, trình biên dịch sẽ tạo các thể hiện (đối tượng) của mỗi hằng enum. Ngoài ra, tất cả hằng của enum luôn được mặc định là public static final.

Ví dụ 3: Lớp Java Enum

enum Size{
  SMALL, MEDIUM, LARGE, EXTRALARGE;

  public String getSize() {

    // sẽ tham chiếu đến đối tượng SMALL
    switch(this) {
      case SMALL:
        return "small";

      case MEDIUM:
        return "medium";

      case LARGE:
        return "large";

      case EXTRALARGE:
        return "extra large";

      default:
        return null;
      }
   }

  public static void main(String[] args) {

    // gọi phương thức getSize()
    // sử dụng đối tượng SMALL
    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, chúng ta đã tạo một lớp enum có tên Size. Nó có bốn hằng là SMALL, MEDIUM, LARGE, EXTRALARGE.

Vì Size là một lớp enum, nên trình biên dịch sẽ tự động tạo các thể hiện cho mỗi hằng enum.

Ở đây bên trong phương thức main(), ta đã sử dụng thể hiện SMAILL để gọi phương thức getSize().

Lưu ý : Giống như các lớp thông thường, một lớp enum cũng có thể bao gồm các hàm tạo. Để tìm hiểu thêm về nó, hãy truy cập hàm tạo Java enum.

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

Có một số phương thức được định nghĩa trước trong các lớp enum có sẵn để sử dụng như sau:

1. Java Enum ordinal()

Phương thức ordinal() trả về vị trí của một hằng enum. Ví dụ:

ordinal(SMALL)
// returns 0

2. Enum compareTo()

Phương thức compareTo() so sánh hằng enum dựa trên giá trị thứ tự của chúng. Ví dụ:

Size.SMALL.compareTo(Size.MEDIUM)
 // returns ordinal(SMALL) - ordinal(MEDIUM)

3. Enum toString()

Phương thức toString() trả về chuỗi đại diện của hằng enum. Ví dụ:

SMALL.toString()
// returns "SMALL"

4. Enum name()

Phương thức name() trả về tên xác định một hằng enum ở dạng hằng chuỗi. Ví dụ:

SMALL.name()
// returns "SMALL"

5. Enum valueOf()

Phương thức valueOf() trả về hằng enum tương ứng với chuỗi trong đối số. Ví dụ:

Size.valueOf("SMALL")
// trả về hằng SMALL

6. Enum values()

Phương thức values() trả về một mảng có kiểu enum chứa tất cả các hằng enum. Ví dụ:

Size[] enumArray = Size.values();

Vai trò của Java Enum?

Trong Java, enum được giới thiệu để thay thế việc sử dụng hằng int.

Giả sử chúng ta đã sử dụng một tập hợp các hằng int.

class Size {
   public final static int SMALL = 1;
   public final static int MEDIUM = 2;
   public final static int LARGE = 3;
   public final static int EXTRALARGE = 4;
}

Ở đây, vấn đề nảy sinh nếu chúng ta in các hằng. Đó là bởi vì chỉ số được in ra có thể không hữu ích.

Vì vậy, thay vì sử dụng hằng int, chúng ta có thể chỉ cần sử dụng enum. Ví dụ:

enum Size {
   SMALL, MEDIUM, LARGE, EXTRALARGE
}

Điều này làm cho mã của chúng ta trực quan hơn.

Ngoài ra, enum cung cấp sự an toàn kiểu thời gian biên dịch.

Nếu chúng ta khai báo một biến có kiểu Size, ví dụ,

Size size;

thì ở đây, nó được đảm bảo rằng biến sẽ giữ một trong bốn giá trị. Bây giờ, nếu chúng ta cố gắng truyền các giá trị khác với bốn giá trị đó, trình biên dịch sẽ tạo ra lỗi.

Hàm tạo Enum

Bây giờ ta sẽ tìm hiểu về các hàm tạo enum với sự trợ giúp của một ví dụ.

Trong Java, một lớp enum có thể bao gồm một phương thức khởi tạo giống như một lớp thông thường. Các hàm tạo enum này là

  • private - có thể truy cập trong lớp
    hoặc
  • package-private - có thể truy cập trong gói

Ví dụ: enum Constructor

enum Size {
   // các hằng enum gọi đến các hàm tạo enum
   SMALL("The size is small."),
   MEDIUM("The size is medium."),
   LARGE("The size is large."),
   EXTRALARGE("The size is extra large.");

   private final String pizzaSize;

   // hàm tạo private
   private Size(String pizzaSize) {
      this.pizzaSize = pizzaSize;
   }

   public String getSize() {
      return pizzaSize;
   }
}

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, chúng ta đã tạo một enum Size. Nó bao gồm một phương thức private khởi tạo enum. Hàm tạo nhận một giá trị chuỗi làm tham số và gán giá trị cho biến pizzaSize.

Vì phương thức khởi tạo là private, chúng ta không thể truy cập nó từ bên ngoài lớp. Tuy nhiên, chúng ta có thể sử dụng hằng enum để gọi hàm tạo.

bên trong lớp Main, chúng ta đã gán SMALL cho một biến enum đó là size. Hằng SMALL sau đó gọi hàm tạo Size với chuỗi làm đối số.

Cuối cùng, chúng ta đã gọi getSize() bằng cách sử dụng size.

Chuỗi enum trong Java

Trong phần này, chúng ta sẽ học cách tìm hiểu về các giá trị chuỗi cho hằng enum. Chúng ta cũng sẽ học cách ghi đè giá trị chuỗi mặc định cho các hằng enum với sự trợ giúp của các ví dụ.

Chuỗi enum trong Java

Trong Java, chúng ta có thể lấy biểu diễn chuỗi của hằng enum bằng cách sử dụng phương thức toString() hoặc phương thức name(). Ví dụ:

enum Size {
   SMALL, MEDIUM, LARGE, EXTRALARGE
}

class Main {
   public static void main(String[] args) {

      System.out.println("string value of SMALL is " + Size.SMALL.toString());
      System.out.println("string value of MEDIUM is " + Size.MEDIUM.name());

   }
}

Đầu ra

giá trị chuỗi của SMALL là SMALL
giá trị chuỗi MEDIUM là MEDIUM

Trong ví dụ trên, chúng ta đã thấy biểu diễn chuỗi mặc định của một hằng số enum là tên của cùng một hằng số.

Thay đổi giá trị chuỗi mặc định của enums

Chúng ta có thể thay đổi cách biểu diễn chuỗi mặc định của hằng enum bằng cách ghi đè phương thức toString(). Ví dụ:

enum Size {
   SMALL {
      // ghi đè phương thức toString() cho SMALL
      public String toString() {
        return "The size is small.";
      }
   },

   MEDIUM {
     // cho MEDIUM
      public String toString() {
        return "The size is medium.";
      }
   };
}

class Main {
   public static void main(String[] args) {
      System.out.println(Size.MEDIUM.toString());
   }
}

Kết quả:

The size if medium.

Trong chương trình trên, chúng ta đã tạo một enum Size. Và chúng ta đã ghi đè phương thức toString() cho hằng enum SMALL và MEDIUM.

Lưu ý: Chúng ta không thể ghi đè phương thức name(), đó là bởi vì name() là final.

Bạn có thể tìm hiểu thêm về chuỗi enum tại cách tốt nhất để tạo Chuỗi enum.

» Tiếp: Lớp (Class) và Đối tượng (Object)
« Trước: Cách xuống dòng mới khi dùng NetBean hay IntelliJ
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!