enum
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 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.PIADlà lỗi compile ngay. - In ra thì được tên (
PAID). Methodordinal()trả về số thứ tự, đánh từ 0:NEWlà 0,PAIDlà 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
2ordinal() 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âuenum Size { SMALL, MEDIUM, LARGE } System.out.println(Size.LARGE.ordinal()); In ra gì?
Dữ liệu nào nên dùng enum?
Vì sao enum an toàn hơn chuỗi khi lưu trạng thái đơn hàng?