Java 5 引入 enum,不僅是常量集合,更是功能完整的類,可攜帶屬性、方法、實現介面。本文從基礎到進階全面解析。
public enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}
// 使用
Season s = Season.SPRING;
System.out.println(s.name()); // SPRING
System.out.println(s.ordinal()); // 0
System.out.println(Season.valueOf("SUMMER")); // SUMMER
for (Season ss : Season.values()) { ... }
public enum HttpStatus {
OK(200, "成功"),
NOT_FOUND(404, "未找到"),
SERVER_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 fromCode(int code) {
for (HttpStatus s : values()) {
if (s.code == code) return s;
}
throw new IllegalArgumentException("Unknown code: " + code);
}
}
public interface DiscountStrategy {
double apply(double price);
}
public enum DiscountType implements DiscountStrategy {
NONE(0) {
public double apply(double price) { return price; }
},
VIP(10) {
public double apply(double price) { return price * 0.9; }
},
SUPER_VIP(20) {
public double apply(double price) { return price * 0.8; }
};
private final int level;
DiscountType(int level) { this.level = level; }
}
// 使用
DiscountStrategy strategy = DiscountType.VIP;
double finalPrice = strategy.apply(100); // 90.0
public enum PayChannel implements PaymentProcessor {
ALIPAY("支付寶") {
public void pay(double amt) { System.out.println("支付寶支付 " + amt); }
},
WECHAT("微信支付") {
public void pay(double amt) { System.out.println("微信支付 " + amt); }
},
UNIONPAY("銀聯") {
public void pay(double amt) { System.out.println("銀聯支付 " + amt); }
};
private final String name;
PayChannel(String name) { this.name = name; }
public String getName() { return name; }
public static PayChannel fromName(String name) {
for (PayChannel c : values()) {
if (c.name.equals(name)) return c;
}
throw new IllegalArgumentException("不支援的渠道: " + name);
}
}
interface PaymentProcessor {
void pay(double amount);
}
// EnumSet:位向量實現,極快
Set active = EnumSet.of(DiscountType.VIP, DiscountType.SUPER_VIP);
// EnumMap:陣列實現,鍵為 Enum
Map descMap = new EnumMap<>(HttpStatus.class);
descMap.put(HttpStatus.OK, "請求成功");
valueOf,防止單例破壞。Season.class.getEnumConstants()。String desc = switch (status) {
case OK -> "成功";
case NOT_FOUND -> "未找到";
default -> "未知";
};
final 確保不可變。fromXxx 靜態工廠方法,避免調用方硬編碼 valueOf。if-else,提升擴展性。