枚舉(Java 5 引入)用於定義取值範圍固定的變量集合,如星期、季節、訂單狀態。枚舉前常用 interface + int 常量,缺點:
public enum ColorEnum { RED, GREEN, YELLOW, BLUE; }
public static final,實例唯一。switch、for (ColorEnum c : ColorEnum.values()) 遍歷。ordinal()(索引)、compareTo()(實現 Comparable)。public enum SeasonEnum {
SPRING, SUMMER, AUTUMN, WINTER;
private static final String POS = "test";
public static SeasonEnum getSeason() {
return "test".equals(POS) ? SPRING : WINTER;
}
}
枚舉本質是 final class extends Enum,可定義靜態/實例字段、方法、構造器。
public enum Gender {
MAN("男"), WOMAN("女");
private final String value;
Gender(String value) { this.value = value; }
public String getValue() { return value; }
}
public enum OrderState {
CANCEL { public String getName() { return "已取消"; } },
WAIT_CONFIRM { public String getName() { return "待審核"; } },
WAIT_PAY { public String getName() { return "待付款"; } },
// ...
public abstract String getName();
}
每個枚舉值可覆寫抽象方法,實現「常量特定行為」,替代大量 if-else。
public enum OrderStatus {
NEW { void next(Order o) { o.setStatus(PAID); } },
PAID { void next(Order o) { o.setStatus(SHIPPED); } },
SHIPPED { void next(Order o) { o.setStatus(DELIVERED); } },
DELIVERED { void next(Order o) { throw new IllegalStateException(); } };
abstract void next(Order order);
}
public enum PayStrategy {
ALIPAY { public void pay(double amt) { /* 支付寶邏輯 */ } },
WECHAT { public void pay(double amt) { /* 微信邏輯 */ } };
public abstract void pay(double amount);
}
// 使用
PayStrategy.ALIPAY.pay(100);
public enum Singleton {
INSTANCE;
public void doSomething() { ... }
}
// 調用:Singleton.INSTANCE.doSomething();
枚舉單例:防反射攻擊、防序列化破壞、天然線程安全,Effective Java 推薦寫法。
| 方法 | 說明 |
|---|---|
values() | 返回所有枚舉值數組 |
valueOf(String name) | 根據名稱獲取枚舉值,找不到拋異常 |
ordinal() | 聲明順序索引(從 0 開始) |
name() | 枚舉常量名稱 |
compareTo(E o) | 比較順序 |
枚舉不只是「一組常量」,它是功能完整的類,支援字段、方法、介面實現、多態。善用枚舉能消除魔術數字、簡化狀態機、實現策略模式、編寫線程安全單例,是 Java 開發者必須精通的進階特性。