方式一:簡單列舉
public enum SexEnum { MALE, FEMALE }
方式二:帶屬性與建構子
public enum SexEnum1 {
MALE(1), FEMALE(2);
private final int id;
private SexEnum1(int id) { this.id = id; }
public static SexEnum1 getEnum(int id) {
for (SexEnum1 s : values()) if (s.id == id) return s;
return null;
}
}
實戰測試代碼
public class TestEnum {
public static void main(String[] args) {
// 1. 列舉所有名稱
for (SexEnum sex : SexEnum.values())
System.out.println(sex.name());
// 2. Switch 直接使用 Enum
SexEnum sex = SexEnum.MALE;
switch (sex) {
case MALE: System.out.println("男性"); break;
case FEMALE: System.out.println("女性"); break;
default: System.out.println("其他");
}
// 3. 透過數值取得 Enum 物件
SexEnum1 s = SexEnum1.getEnum(3); // 找不到回傳 null
switch (s) {
case MALE: System.out.println("男"); break;
case FEMALE: System.out.println("女"); break;
default: System.out.println("其他");
}
}
}
關鍵特性總結
values():靜態方法,回傳所有列舉常數陣列
name():取得常數名稱字串
ordinal():取得宣告順序 (0-based)
- 建構子必須 private,不可外部實例化
- 可實作介面、定義方法、欄位,功能等同類別
- Switch 可直接用 Enum 型別,編譯器自動補全 case
- 序列化自動處理,單例模式最佳實踐之一
進階用法提示
- 策略模式:每個常數實作不同行為
- 狀態機:Enum 表示狀態,轉換邏輯封裝在內
- 替代常數介面:類型安全、命名空間隔離、IDE 補全