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

Java 枚舉進階:從基本用法到攜帶行為的複雜枚舉模式

     編輯:Java 綜合教學

Java enum 不僅是常量集合,更是「類型安全、可攜帶行為、可實現接口」的特殊類。本文從基本聲明、屬性方法、switch 支持、實現接口、策略模式枚舉、單例枚舉五個維度,展示枚舉的進階用法與設計模式應用。

1. 基本聲明與常用方法

public enum Season { SPRING, SUMMER, AUTUMN, WINTER }
// 常用方法
Season s = Season.SPRING;
s.name();        // "SPRING"
s.ordinal();     // 0
Season.valueOf("SUMMER"); // Season.SUMMER
Season.values(); // [SPRING, SUMMER, AUTUMN, WINTER]

2. 豐富枚舉:構造器、屬性、方法

public enum HttpStatus {
    OK(200, "成功"),
    NOT_FOUND(404, "未找到"),
    INTERNAL_ERROR(500, "服務器錯誤");
    private final int code;
    private final String msg;
    HttpStatus(int code, String msg) { this.code = code; this.msg = msg; }
    public int getCode() { return code; }
    public String getMsg() { return msg; }
    // 反向查找
    public static HttpStatus of(int code) {
        for (HttpStatus s : values()) if (s.code == code) return s;
        throw new IllegalArgumentException("未知狀態碼: " + code);
    }
}

3. switch 表達式(Java 12+)

String desc = switch (status) {
    case OK -> "請求成功";
    case NOT_FOUND -> "資源不存在";
    case INTERNAL_ERROR -> "服務器異常";
};

4. 枚舉實現接口:行為多態

public interface DiscountStrategy {
    double apply(double price);
}
public enum UserLevel implements DiscountStrategy {
    NORMAL  { public double apply(double p) { return p; } },
    VIP     { public double apply(double p) { return p * 0.9; } },
    SVIP    { public double apply(double p) { return p * 0.8; } };
}
// 使用
double pay = UserLevel.VIP.apply(100); // 90.0

5. 策略模式枚舉:信號燈狀態機(來自原文)

public enum TrafficLight {
    RED(40) {
        @Override public TrafficLight next() { return GREEN; }
    },
    GREEN(20) {
        @Override public TrafficLight next() { return YELLOW; }
    },
    YELLOW(3) {
        @Override public TrafficLight next() { return RED; }
    };
    private final int durationSec;
    TrafficLight(int durationSec) { this.durationSec = durationSec; }
    public int getDurationSec() { return durationSec; }
    public abstract TrafficLight next(); // 強制每個枚舉實現轉換邏輯
}
// 測試
TrafficLight cur = TrafficLight.RED;
for (int i = 0; i < 6; i++) {
    System.out.println(cur + " " + cur.getDurationSec() + "s -> " + cur.next());
    cur = cur.next();
}

6. 單例模式:最佳實現方式

public enum Singleton {
    INSTANCE;
    private Resource resource;
    Singleton() { resource = new Resource(); } // 類加載時執行,天然線程安全
    public Resource getResource() { return resource; }
}
// 使用
Singleton.INSTANCE.getResource().doSomething();
  • 防反射破壞、防序列化重建、代碼極簡、Effective Java 強推。

7. 枚舉與註解結合:框架級應用

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface EnumValue { String value(); }
public enum ErrorCode {
    @EnumValue("USER_NOT_FOUND") USER_NOT_FOUND(1001),
    @EnumValue("PERMISSION_DENIED") PERMISSION_DENIED(1002);
    private final int code;
    ErrorCode(int code) { this.code = code; }
}
// 掃描註解自動生成錯誤碼文檔、前端常量文件

最佳實踐清單

  1. 枚舉常量全大寫,語義清晰。
  2. 構造器私有,屬性 final,保證不可變。
  3. 優先用 EnumMap/EnumSet 替代普通 Map/Set,性能極致、內存極小。
  4. 避免在枚舉中持有大對象或外部資源引用,防止內存洩漏。
  5. 需要擴展性時,考慮接口+實現類替代枚舉。

善用枚舉,讓「常量」變成「有行為的類型」,代碼更安全、更清晰、更具表達力。

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