enum Color { RED, GREEN, BLUE } 編譯後生成 final class Color extends Enum<Color>。每個枚舉常量是該類的 **單例實例**,天然 `public static final`。
| 特性 | 說明 | 示例 |
|---|---|---|
| 類型安全 | 編譯期檢查,避免魔術字符串/整數 | Color c = Color.RED; |
| 單例保證 | JVM 保證每個常量在類加載器中唯一 | 可直接用 == 比較 |
| 實現接口 | 枚舉可實現接口,不同常量可有不同行為 | 策略模式最佳載體 |
| 自帶方法 | values()、valueOf(String)、ordinal()、name()、compareTo() | Color.values() 返回數組 |
| 可定義字段/構造函數/方法 | 豐富領域模型 | 見下文進階示例 |
public enum HttpStatus {
OK(200, "成功"),
NOT_FOUND(404, "未找到"),
SERVER_ERROR(500, "服務器錯誤");
private final int code;
private final String message;
HttpStatus(int code, String message) {
this.code = code;
this.message = message;
}
public int code() { return code; }
public String message() { return message; }
}
public interface DiscountStrategy {
BigDecimal apply(BigDecimal original);
}
public enum UserLevel implements DiscountStrategy {
NORMAL { public BigDecimal apply(BigDecimal p) { return p; } },
VIP { public BigDecimal apply(BigDecimal p) { return p.multiply(new BigDecimal("0.9")); } },
SVIP { public BigDecimal apply(BigDecimal p) { return p.multiply(new BigDecimal("0.8")); } };
}
// 使用
BigDecimal finalPrice = user.getLevel().apply(originalPrice); // 無 switch、無 if-else
public enum ReportType implements ReportGenerator {
DAILY { protected void doGenerate() { /* 日報邏輯 */ } },
WEEKLY { protected void doGenerate() { /* 週報邏輯 */ } },
MONTHLY { protected void doGenerate() { /* 月報邏輯 */ } };
public final void generate() { // 模板方法
prepareData();
doGenerate();
sendNotification();
}
protected abstract void doGenerate();
private void prepareData() { ... }
private void sendNotification() { ... }
}
EnumMap<Color, Integer>:底層數組,比 HashMap 快 2-3 倍,無哈希碰撞。EnumSet.noneOf(Color.class):位向量實現,集合操作極快,替代位掩碼。ordinal() 給外部依賴:插入新常量會改變序數,導致持久化數據錯亂。持久化用 name() 或自定義 code 字段。readResolve。public enum Singleton { INSTANCE; }。java.lang.Enum(Java 單繼承)。但可實現接口。values() 是關鍵字嗎?不是,是編譯器生成的靜態方法,返回拷貝數組(防篡改)。