Java enum 不僅是常量集合,更是「類型安全、可攜帶行為、可實現接口」的特殊類。本文從基本聲明、屬性方法、switch 支持、實現接口、策略模式枚舉、單例枚舉五個維度,展示枚舉的進階用法與設計模式應用。
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]
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);
}
}
String desc = switch (status) {
case OK -> "請求成功";
case NOT_FOUND -> "資源不存在";
case INTERNAL_ERROR -> "服務器異常";
};
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
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();
}
public enum Singleton {
INSTANCE;
private Resource resource;
Singleton() { resource = new Resource(); } // 類加載時執行,天然線程安全
public Resource getResource() { return resource; }
}
// 使用
Singleton.INSTANCE.getResource().doSomething();
@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; }
}
// 掃描註解自動生成錯誤碼文檔、前端常量文件
EnumMap/EnumSet 替代普通 Map/Set,性能極致、內存極小。善用枚舉,讓「常量」變成「有行為的類型」,代碼更安全、更清晰、更具表達力。