Khi mới học Java, rất nhiều người (kể cả dev lâu năm 😅) đều thắc mắc:
❓ “Enum nhìn giống constant quá, vậy sinh ra làm gì?”
Câu trả lời là:
👉 Enum không chỉ là constant
👉 Enum là constant + kiểu dữ liệu + logic + luật chơi
Bài này mình sẽ giải thích từ dễ → sâu, không lý thuyết khô khan ✨
1️⃣ Constant kiểu cũ – quen mà nguy hiểm ⚠️
Trước khi có enum, ta hay viết thế này:
public class Role {
public static final int ADMIN = 0;
public static final int USER = 1;
public static final int GUEST = 2;
}
Dùng:
int role = Role.ADMIN;
Nghe có vẻ ổn… nhưng vấn đề là 👇
role = 999; // 😱 Java vẫn cho compile
❌ Sai logic
❌ Không báo lỗi
❌ Debug cực mệt
2️⃣ Enum xuất hiện – giải cứu nhân loại 🌟
enum Role {
ADMIN,
USER,
GUEST
}
Dùng:
Role role = Role.ADMIN;
👉 Và lúc này:
role = 999; // ❌ compile error
🎉 Java bắt lỗi ngay từ lúc code
3️⃣ Nhưng enum KHÔNG chỉ dừng ở đó 😎
Enum thực chất là một class đặc biệt
Nó có thể có:
- biến (field)
- constructor
- method
- logic riêng
4️⃣ Enum có nhiều biến – Java “tự hiểu” thế nào? 🤔
Ví dụ:
enum Role {
ADMIN("Admin", 10, true),
USER("User", 1, false),
GUEST("Guest", 0, false);
private String name;
private int level;
private boolean canDelete;
Role(String name, int level, boolean canDelete) {
this.name = name;
this.level = level;
this.canDelete = canDelete;
}
}
👉 Nhiều bạn sẽ hỏi:
❓ “Ủa, sao Java biết gán cái nào vào cái nào?”
5️⃣ Java KHÔNG đoán mò – nó rất kỷ luật 🧠
Java map dữ liệu dựa trên 3 thứ:
- Thứ tự
- Kiểu dữ liệu
- Constructor của enum
Role(String name, int level, boolean canDelete)
thì:
ADMIN("Admin", 10, true)
// ↓ ↓ ↓
String int boolean
❌ Đổi thứ tự → lỗi
❌ Thiếu / dư tham số → lỗi
Java không quan tâm tên biến, chỉ quan tâm:
Kiểu + thứ tự
6️⃣ Vì sao enum không cho new? 🔒
Bạn không thể viết:
new Role("Admin", 10, true); // ❌
👉 Vì:
- Constructor enum luôn là private
- Java chỉ cho phép các instance đã khai báo sẵn
➡ Điều này đảm bảo:
Enum = tập giá trị cố định, không thể sinh lung tung
7️⃣ Enum vs Constant – so nhanh cho dễ nhớ 📊
| Tiêu chí | Constant | Enum |
|---|---|---|
| Có kiểu dữ liệu riêng | ❌ | ✅ |
| Chặn gán giá trị sai | ❌ | ✅ |
| Có nhiều thuộc tính | ❌ | ✅ |
| Có method, logic | ❌ | ✅ |
| Đọc code dễ hiểu | 😵 | 😍 |
| Dùng cho state / role | ⚠️ | 🔥 |
8️⃣ Ví dụ thực tế (rất hay dùng) 🎮🌐
🎮 Game
enum PlayerState {
IDLE, ATTACK, DEFEND, DEAD
}
🌐 Web
enum OrderStatus {
NEW, PAID, SHIPPED, CANCELLED
}
🤖 AI / Logic
enum Decision {
ATTACK, RUN, HIDE
}
9️⃣ Best practice khi dùng Enum ✨
✔ Field nên để private final
✔ Dùng enum cho state / type / role / mode
❌ Không dùng enum như biến động (data thay đổi liên tục)
❌ Không dùng ordinal() để lưu DB
🔚 Kết luận (đọc 1 câu là nhớ)
Constant = con số có tên Enum = một khái niệm hoàn chỉnh trong code
Nếu bạn đang làm:
- game 🎮
- web 🌐
- AI / logic 🤖
👉 Enum là thứ nên dùng gần như mặc định