枚舉(enum)是 JDK 5 引入的特殊類,用於表示固定常量集合。相比傳統 public static final int 常量,枚舉提供:
EventStatus.DRAFT 避免常量衝突package com.school.stereotype;
/**
* 活動狀態枚舉
*/
public enum EventStatus {
/** 未發布 */
DRAFT("DRAFT", "未發布"),
/** 已發布 */
PUBLISHED("PUBLISHED", "已發布");
private final String value; // 數據庫存儲值
private final String text; // 前端顯示文本
EventStatus(String value, String text) {
this.value = value;
this.text = text;
}
public String getValue() { return value; }
public String getText() { return text; }
/**
* 根據值反查枚舉實例
* @param value 數據庫值
* @return 對應枚舉
* @throws IllegalArgumentException 無匹配值
*/
public static EventStatus getInstance(String value) {
for (EventStatus status : values()) {
if (status.value.equalsIgnoreCase(value)) {
return status;
}
}
throw new IllegalArgumentException("非法狀態值: " + value);
}
}
public enum Operation implements Calculator {
ADD("+") { public int apply(int a, int b) { return a + b; } },
SUB("-") { public int apply(int a, int b) { return a - b; } },
MUL("*") { public int apply(int a, int b) { return a * b; } },
DIV("/") { public int apply(int a, int b) { return a / b; } };
private final String symbol;
Operation(String symbol) { this.symbol = symbol; }
public String getSymbol() { return symbol; }
}
interface Calculator {
int apply(int a, int b);
}
public enum PayStrategy {
ALIPAY("支付寶") {
public void pay(double amount) { /* 支付寶邏輯 */ }
},
WECHAT("微信支付") {
public void pay(double amount) { /* 微信邏輯 */ }
};
private final String name;
PayStrategy(String name) { this.name = name; }
public abstract void pay(double amount);
public String getName() { return name; }
}
public enum OrderStatus {
CREATED("已創建") {
public OrderStatus next() { return PAID; }
public boolean canCancel() { return true; }
},
PAID("已支付") {
public OrderStatus next() { return SHIPPED; }
public boolean canCancel() { return false; }
},
SHIPPED("已發貨"),
COMPLETED("已完成");
private final String desc;
OrderStatus(String desc) { this.desc = desc; }
OrderStatus() { this(""); }
public abstract OrderStatus next();
public abstract boolean canCancel();
public String getDesc() { return desc; }
}
| 方法 | 說明 |
|---|---|
values() | 返回所有枚舉常量數組 |
valueOf(String name) | 根據名稱獲取枚舉,區分大小寫 |
ordinal() | 返回聲明順序(從 0 開始),避免業務依賴 |
name() | 返回常量名稱(如 "DRAFT") |
compareTo(E o) | 比較聲明順序 |
getInstance() 避免散落的 switch-casepublic enum Singleton { INSTANCE; } 線程安全、防反射、防序列化破壞@Enumerated(EnumType.STRING) 存儲名稱,EnumType.ORDINAL 存儲順序(不推薦)value 或 text,而非 name