enum 是 JDK 1.5 引入的特殊類類型,用於表示固定常量集合。本文系統講解枚舉基本特性、方法添加、switch 使用、values() 來源等核心知識點。
public static final 字段;java.lang.Enum,不可再繼承其他類;import static pkg.EnumType.*;enum Shrubbery { GROUND, CRAWLING, HANGING }
public class EnumDemo {
public static void main(String[] args) {
for (Shrubbery s : Shrubbery.values()) {
System.out.println(s + " ordinal: " + s.ordinal());
System.out.println(s.compareTo(Shrubbery.CRAWLING));
System.out.println(s == Shrubbery.CRAWLING); // 推薦 == 比較
System.out.println(s.getDeclaringClass());
System.out.println(s.name());
}
// 字符串轉枚舉
for (String str : "HANGING CRAWLING GROUND".split(" ")) {
Shrubbery e = Enum.valueOf(Shrubbery.class, str);
System.out.println(e);
}
}
}
public enum OzWitch {
WEST("Miss Gulch"), NORTH("Glinda"), EAST("Wicked Witch"), SOUTH("Good");
private final String description;
private OzWitch(String desc) { this.description = desc; }
public String getDescription() { return description; }
public static void main(String[] args) {
for (OzWitch w : values()) System.out.println(w + ": " + w.getDescription());
}
}
注意:實例必須在方法前定義,最後一個實例後需加分號。
public enum SpaceShip {
SCOUT, CARGO, TRANSPORT, CRUISER, BATTLESHIP, MOTHERSHIP;
@Override public String toString() {
String id = name();
return id.charAt(0) + id.substring(1).toLowerCase();
}
}
enum Signal { GREEN, YELLOW, RED }
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED: color = Signal.GREEN; break;
case GREEN: color = Signal.YELLOW; break;
case YELLOW: color = Signal.RED; break;
}
}
}
case 標簽直接寫枚舉常量名,無需 前綴類名。
values() 是編譯器自動添加的 static 方法,不在 java.lang.Enum 中。可通過反射 Signal.class.getMethods() 查看。