1. 枚举的基本定义与语法要点
本章聚焦 Java 枚举的基本定义与语法要点,帮助你快速理解枚举常量的声明方式与特性。Java 枚举是一种特殊的类,可以定义常量、字段、方法和构造函数,具备与普通类相同的封装能力。
示例颜色枚举展示了如何把RGB值与颜色常量绑定,常量列表按逗号分隔,末尾可选分号,常量之间的顺序不可随意改变。下面的代码演示了如何为每个枚举常量绑定参数,并提供一个公共方法来返回十六进制表示。
public enum Color {RED(255,0,0),GREEN(0,255,0),BLUE(0,0,255);private final int r;private final int g;private final int b;Color(int r, int g, int b) {this.r = r;this.g = g;this.b = b;}public String toHex() {return String.format("#%02X%02X%02X", r, g, b);}
}
除了常量之外,枚举也提供了 values()、valueOf(String) 等实用方法,它们在遍历和解析时非常有用。values() 会返回所有枚举常量的数组,valueOf 根据名称返回对应的枚举常量。
为了实现更多行为,可以给枚举定义字段、构造函数以及方法,从而让每个常量携带自己的状态和逻辑。下面的构造示例演示了如何为每个枚举常量绑定不同的描述或属性。
public enum Size {SMALL(8),MEDIUM(12),LARGE(16);private final int px;Size(int px) { this.px = px; }public int getPx() { return px; }
}2. 参数化枚举(泛型枚举)与实战示例
在某些场景下,需要让枚举携带或返回泛型描述,这就涉及参数化枚举(泛型枚举)的概念。通过为枚举声明类型参数
下面展示了一个参数化枚举的基本定义:泛型类型参数绑定在枚举类型上,常量可以传入与
public enum Result {SUCCESS("OK"),FAILURE("ERROR");private final T description;Result(T description) { this.description = description; }public T getDescription() { return description; }
}
使用示例展示了如何在实际代码中应用该泛型枚举,并输出描述信息。在使用时通常指定具体的类型参数,如 Result<String>,以确保类型安全与可预测的行为。

public class Demo {public static void main(String[] args) {Result<String> r = Result.SUCCESS;System.out.println("描述: " + r.getDescription());// 泛型描述的实际使用String s = r.getDescription();System.out.println(s.length());}
}
需要注意的是,枚举是泛型类型时,类型参数通常在使用时显式或通过上下文推断,但在定义常量时必须确保传入的值与泛型类型匹配,以避免编译错误。
3. 实战场景与进阶用法
3.1 实战场景:状态机与策略模式的枚举实现
在实际应用中,枚举可以用来实现状态机、策略模式等设计模式,通过每个常量覆盖不同的行为实现多态。下面的示例演示了一个简单的支付策略枚举:
public enum PaymentStrategy {CREDIT_CARD {@Overridepublic void pay(double amount) {System.out.println("使用信用卡支付: " + amount);}},PAYPAL {@Overridepublic void pay(double amount) {System.out.println("使用 PayPal 支付: " + amount);}};public abstract void pay(double amount);
}
通过枚举覆盖行为,可以实现策略的快速切换与统一调用入口,而无需为不同策略创建多态类层级,降低代码复杂性。
此外,使用 EnumMap/EnumSet 等枚举专用集合可以提升性能,并让代码更具可读性与可维护性。
import java.util.EnumMap;
import java.util.EnumSet;public enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; }void demoEnumMapAndEnumSet() {EnumMap<Day, String> schedule = new EnumMap<>(Day.class);schedule.put(Day.MONDAY, "例行会议");schedule.put(Day.SATURDAY, "休息");EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);for (Day d : weekend) {System.out.println(d);}
}
3.2 高级用法:与常量实例的复合行为
另一个实用方向是让枚举常量在声明时就绑定不同的实现,通过匿名类块实现个性化行为,使得每个常量具有独有的逻辑分支,便于后续维护与扩展。
public enum LoggerLevel {INFO {@Overridepublic void log(String msg) {System.out.println("[INFO] " + msg);}},WARN {@Overridepublic void log(String msg) {System.out.println("[WARN] " + msg);}},ERROR {@Overridepublic void log(String msg) {System.err.println("[ERROR] " + msg);}};public abstract void log(String msg);
}
这种实现方式使得枚举不仅是状态的集合,更是行为的组合体,适用于简单的策略分发场景。结合泛型和枚举的组合使用,可以实现更复杂的状态驱动逻辑,但也要避免过度设计,提高代码的可读性。


