Enum 是 enumeration(枚舉)的縮寫,屬於 java.lang 套件。熟悉 C、C++、C# 或 Pascal 的開發者對此概念應不陌生。簡單來說,Enum 定義了一組固定的常量值,例如:
public enum Season { WINTER, SPRING, SUMMER, FALL }
每個 Enum 實例都是該類型的唯一對象,無法存在重複值。在 Java 1.5 之前,開發者通常透過介面模擬枚舉:
public interface Season {
static int WINTER = 0;
static int SPRING = 1;
// ...
}
引入 Enum 後,寫法更簡潔,且每個值會自動獲得從 0 開始遞增的序數。
package net.javagarage.enums;
public class EnumDemo {
private enum Seasons { WINTER, SPRING, SUMMER, FALL }
public static void main(String[] args) {
for (Seasons s : Seasons.values()) {
System.out.println(s);
}
}
}
執行結果:
WINTER SPRING SUMMER FALL
package net.javagarage.enums;
public class EnumSwitch {
private enum Color { RED, BLUE, GREEN }
public static void main(String[] args) {
doIt(Color.RED);
}
private static void doIt(Color c) {
switch (c) {
case RED:
System.out.println("value is " + Color.RED);
break;
case GREEN:
System.out.println("value is " + Color.GREEN);
break;
case BLUE:
System.out.println("value is : " + Color.BLUE);
break;
default:
System.out.println("default");
}
}
}
注意:switch case 中直接使用非限定名稱(如 case RED:),而非 case Color.RED:。
Enum 可以像一般類別一樣擁有屬性、方法(靜態與非靜態),但值的列表必須緊跟在 enum 宣告之後,否則編譯錯誤。
public class EnumWithMethods {
public enum Season {
WINTER, SPRING, SUMMER, FALL;
private final static String LOCATION = "Phoenix";
public static Season getBest() {
if (LOCATION.equals("Phoenix"))
return WINTER;
else
return SUMMER;
}
}
public static void main(String[] args) {
System.out.println(Season.getBest());
}
}
Enum 可自訂建構子,為每個常量賦予特定數據:
public class EnumConstructor {
public static void main(String[] a) {
for (Temp t : Temp.values())
System.out.println(t + " is : " + t.getValue());
}
public enum Temp {
ABSOLUTE_ZERO(-459), FREEZING(32),
BOILING(212), PAPER_BURNS(451);
private final int value;
Temp(int value) { this.value = value; }
public int getValue() { return value; }
}
}
輸出:
ABSOLUTE_ZERO is : -459 FREEZING is : 32 BOILING is : 212 PAPER_BURNS is : 451
雖然 Enum 功能強大,但不宜濫用。若需複雜行為,直接定義類別更合適。Enum 的優勢在於定義一組語義明確的常量,且這些值具有特殊業務含義時。