VieTopik
Tiếng HànTiếng Anh.NET (C#)Java
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
Java CoreClass cơ bản
Bài 15/19
4 phút

enum

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Đơn hàng chỉ có vài trạng thái: mới, đã thanh toán, đang giao, đã huỷ. Nếu lưu trạng thái bằng chuỗi, gõ nhầm "paid" thành "piad" thì compiler cũng không phát hiện. Với enum, bạn chọn giá trị theo tên trong một danh sách cố định, và gõ nhầm tên là lỗi compile.

Khái niệm

🎚️ enum: kiểu gồm một danh sách giá trị có tên cố định, mỗi giá trị có một số thứ tự đi kèm.

Ví dụ

// Main.java
void main() {
    OrderStatus status = OrderStatus.PAID;

    if (status == OrderStatus.PAID) {
        System.out.println("Chuẩn bị giao hàng");
    }

    System.out.println(status);             // PAID
    System.out.println(status.ordinal());   // 1
}

// OrderStatus.java
enum OrderStatus {
    NEW,
    PAID,
    SHIPPING,
    CANCELLED
}
  • Khai báo enum OrderStatus { ... }, dùng giá trị qua tên enum: OrderStatus.PAID. Tên giá trị viết hoa như hằng.
  • Gõ sai tên như OrderStatus.PIAD là lỗi compile ngay.
  • In ra thì được tên (PAID). Method ordinal() trả về số thứ tự, đánh từ 0: NEW là 0, PAID là 1.
  • Mỗi giá trị enum là một object duy nhất, nên so bằng == là đúng.

Thử ngay

Giữ nguyên OrderStatus.java, thay nội dung Main.java bằng đoạn sau rồi chạy java Main.java:

// Main.java
void main() {
    OrderStatus status = OrderStatus.SHIPPING;

    switch (status) {
        case NEW:
            System.out.println("Chờ thanh toán");
            break;
        case PAID:
            System.out.println("Chuẩn bị giao");
            break;
        case SHIPPING:
            System.out.println("Đang giao");
            break;
        default:
            System.out.println("Đã huỷ");
            break;
    }

    System.out.println(status.ordinal());
}

Đoán trước khi chạy: dòng cuối in ra SHIPPING hay một con số?

Xem kết quả
Đang giao
2

ordinal() trả về số thứ tự: NEW 0, PAID 1, SHIPPING 2. Trong switch, case chỉ ghi tên giá trị (SHIPPING), không cần OrderStatus. phía trước.

Lỗi hay gặp

Dùng chuỗi cho giá trị cố định. Gõ nhầm vẫn chạy, chỉ là chạy sai.

// SAI — gõ nhầm "piad", điều kiện sai mà không ai biết
String status = "piad";
if (status.equals("paid")) {
    System.out.println("Chuẩn bị giao hàng");
}
// ĐÚNG — gõ nhầm tên enum sẽ bị compiler bắt
OrderStatus status = OrderStatus.PAID;
if (status == OrderStatus.PAID) {
    System.out.println("Chuẩn bị giao hàng");
}

Tên enum đặt số nhiều. Một biến chỉ giữ một trạng thái, nên tên enum là số ít.

// SAI — đọc thành "một đơn có nhiều trạng thái"
// OrderStatuses.java
enum OrderStatuses { NEW, PAID, SHIPPING, CANCELLED }
// ĐÚNG
// OrderStatus.java
enum OrderStatus { NEW, PAID, SHIPPING, CANCELLED }

Tóm tắt

  • enum là danh sách giá trị có tên cố định, như trạng thái đơn hàng.
  • Dùng qua tên enum: OrderStatus.PAID. Gõ sai tên là lỗi compile.
  • Mỗi giá trị có số thứ tự đi kèm, lấy bằng ordinal(), đánh từ 0.
  • Dùng enum thay cho chuỗi khi giá trị nằm trong một danh sách cố định.

Tự kiểm tra

0/3 câu
Câu 1

enum Size { SMALL, MEDIUM, LARGE } System.out.println(Size.LARGE.ordinal()); In ra gì?

Câu 2

Dữ liệu nào nên dùng enum?

Câu 3

Vì sao enum an toàn hơn chuỗi khi lưu trạng thái đơn hàng?

staticLambda

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt