Java枚举是完整类型,可携带状态、封装行为、表达契约:需定义私有final字段与私有构造器初始化,用抽象方法实现多态行为,并提供fromCode等工具方法支持反查与校验。

Java 枚举不是静态常量表,而是可携带状态、封装行为、表达契约的完整类型。关键在于三件事:给每个枚举项绑定专属属性(如 code、desc、启用状态),用私有构造器初始化这些字段,再通过抽象方法让不同项拥有各自逻辑——这样就能自然替代大量 if-else 和策略映射。
定义带字段和私有构造器的枚举
这是所有高级用法的基础。枚举常量声明时括号里的参数,会自动调用你写的私有构造方法完成初始化。
- 字段必须声明为 private final,确保不可变性
- 构造器必须是 private(显式写或省略都默认如此)
- 枚举常量列表必须放在类最前面,且以分号 ; 结尾
- 建议提供 public getter 方法,不暴露字段本身
例如订单状态枚举:
public enum OrderStatus {
PENDING(0, "待支付", false),
PAID(1, "已支付", true),
SHIPPED(2, "已发货", true);
private final int code;
private final String desc;
private final boolean isFinal;
private OrderStatus(int code, String desc, boolean isFinal) {
this.code = code;
this.desc = desc;
this.isFinal = isFinal;
}
public int getCode() { return code; }
public String getDesc() { return desc; }
public boolean isFinal() { return isFinal; }
}
为每个枚举项定制专属业务行为
当不同状态需要执行差异明显的操作(比如“支付成功”发通知、“取消订单”释放库存),抽象方法是最自然的多态解法。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在常量列表之后、普通方法之前声明 public abstract 方法
- 每个枚举常量必须用大括号 { } 显式实现该方法
- 调用时直接 OrderStatus.PAID.execute(),无需类型判断
延续上面的例子,添加状态流转逻辑:
public abstract void execute();
PENDING {
public void execute() {
System.out.println("跳转支付页");
}
}
PAID {
public void execute() {
System.out.println("触发支付回调 + 更新账务");
}
}
SHIPPED {
public void execute() {
System.out.println("调用物流接口 + 发送短信");
}
}
配套实用工具方法:反查、校验与格式化
仅靠构造器和抽象方法还不够。真实项目中总要根据 code 查枚举、校验输入合法性、或统一输出描述。
- 写 public static Optional<OrderStatus> fromCode(int code):遍历 values() 匹配,返回 Optional 更安全
- 重写 toString():返回
code + " " + desc,比默认输出更直观 - 避免在 toString() 中引用未初始化字段,防止 NullPointerException
- 不要试图重写 values() 或 valueOf() —— 它们由编译器生成,手动定义会编译失败
示例反查方法:
public static Optional<OrderStatus> fromCode(int code) {
return Arrays.stream(values())
.filter(status -> status.code == code)
.findFirst();
}
支持多种数据类型的组合属性
一个枚举常量可以携带多个异构属性,只要构造方法能接收并赋值即可。
- 属性类型不限于基本类型或 String,也可是枚举自身、LocalDateTime、不可变集合等
- 若含可变对象(如 List),务必用 Collections.unmodifiableList 封装
- 避免在构造方法中执行耗时或可能失败的操作(如 IO、网络请求)
- 字段初始化发生在类加载阶段,所以构造逻辑必须稳定、无副作用

















