首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Enum 詳解:從基本用法到進階模式的完整指南

     編輯:Java 相關知識

為什麼需要枚舉?

枚舉(Java 5 引入)用於定義取值範圍固定的變量集合,如星期、季節、訂單狀態。枚舉前常用 interface + int 常量,缺點:

  • 無類型安全:可傳入任意 int。
  • 無命名空間:常量污染全局。
  • 無行為:只能存數據,不能附帶方法。

枚舉核心語法與進階特性

1. 簡單枚舉

public enum ColorEnum { RED, GREEN, YELLOW, BLUE; }
  • 隱含 public static final,實例唯一。
  • 可用於 switch、for (ColorEnum c : ColorEnum.values()) 遍歷。
  • 內建 ordinal()(索引)、compareTo()(實現 Comparable)。

2. 帶屬性與方法的枚舉

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,可定義靜態/實例字段、方法、構造器。

3. 帶構造器的枚舉(關聯數據)

public enum Gender {
    MAN("男"), WOMAN("女");
    private final String value;
    Gender(String value) { this.value = value; }
    public String getValue() { return value; }
}
  • 構造器默認 private,外部不可 new。
  • 所有枚舉值必須統一帶參數或統一不帶。

4. 帶抽象方法的枚舉(多態行為)

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。

實戰最佳實踐

1. 替代狀態機

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);
}

2. 實現策略模式

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);

3. 線程安全單例

public enum Singleton {
    INSTANCE;
    public void doSomething() { ... }
}
// 調用:Singleton.INSTANCE.doSomething();

枚舉單例:防反射攻擊、防序列化破壞、天然線程安全,Effective Java 推薦寫法。

常用 API 速查

方法說明
values()返回所有枚舉值數組
valueOf(String name)根據名稱獲取枚舉值,找不到拋異常
ordinal()聲明順序索引(從 0 開始)
name()枚舉常量名稱
compareTo(E o)比較順序

總結

枚舉不只是「一組常量」,它是功能完整的類,支援字段、方法、介面實現、多態。善用枚舉能消除魔術數字、簡化狀態機、實現策略模式、編寫線程安全單例,是 Java 開發者必須精通的進階特性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved