values()、valueOf()、ordinal()、name()
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
// 遍歷
for (Day d : Day.values()) System.out.println(d);
// switch (Java 12+ 增強)
String type = switch (day) {
case MONDAY, FRIDAY -> "工作日";
case SATURDAY, SUNDAY -> "週末";
default -> "未知";
};
public enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6);
private final double mass; // kg
private final double radius; // m
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double mass() { return mass; }
public double radius() { return radius; }
// 通用常量
public static final double G = 6.67300E-11;
// 實例方法
public double surfaceGravity() {
return G * mass / (radius * radius);
}
public double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
public static void main(String[] args) {
double earthWeight = 70; // kg
for (Planet p : Planet.values()) {
System.out.printf("%s: 表面重力=%.2f, 体重=%.2f N%n",
p, p.surfaceGravity(), p.surfaceWeight(earthWeight));
}
}
}
public interface Operation {
double apply(double x, double y);
}
public enum Op implements Operation {
PLUS { public double apply(double x, double y) { return x + y; } },
MINUS { public double apply(double x, double y) { return x - y; } },
TIMES { public double apply(double x, double y) { return x * y; } },
DIVIDE { public double apply(double x, double y) { return x / y; } };
public static void main(String[] args) {
double x = 10, y = 5;
for (Op op : Op.values())
System.out.printf("%s: %.1f%n", op, op.apply(x, y));
}
}
public enum Singleton {
INSTANCE;
private final String[] initArgs = {"arg1", "arg2"};
public String[] getInitArgs() { return initArgs.clone(); }
public void doSomething() { System.out.println("Singleton working..."); }
}
// 使用
Singleton.INSTANCE.doSomething();
優勢:防反射破壞、防序列化重建、代碼極簡、延遲加載(類加載機制天然保證)。
// EnumSet: 位向量實現,極快
EnumSet workDays = EnumSet.range(Day.MONDAY, Day.FRIDAY);
EnumSet weekend = EnumSet.complementOf(workDays);
// EnumMap: 數組實現,key 為 enum 時比 HashMap 快 2-3 倍
EnumMap schedule = new EnumMap<>(Day.class);
schedule.put(Day.MONDAY, "會議");
schedule.put(Day.FRIDAY, "總結");
| 誤區 | 正確做法 |
|---|---|
用 ordinal() 存數據庫 | 用 name() 或自定義 code 字段,防止插入新枚舉導致序號錯亂 |
| 大量實例字段導致內存膨脹 | 枚舉實例是單例,字段極少時無影響;大量數據外置配置表 |
| switch 未覆蓋所有常量 | Java 12+ switch 表達式強制 exhaustive,漏寫編譯報錯 |
| 嘗試繼承枚舉 | enum 隱式 final,不可繼承;改用接口 + 實現類 |
Enum 不只是「常量集合」,更是「受限制的類」。善用它實現單例、策略、狀態機、位掩碼,代碼更安全、更清晰、更高效。