Java枚举类用enum定义,天然适合表示有限固定状态;支持基础常量声明、带属性构造器、内聚状态判断逻辑及安全反查方法。

Java 中枚举类通过 enum 关键字定义,天然适合表示有限、固定的状态集合(如订单状态、支付状态等),配合方法和字段可轻松实现状态判断逻辑。
基础枚举定义与状态值声明
最简形式是直接列出所有状态常量:
public enum OrderStatus {
CREATED,
PAID,
SHIPPED,
DELIVERED,
CANCELLED
}
每个名称(如 CREATED)都是该枚举类型的唯一实例,编译器自动保证单例性和类型安全。
带属性和构造方法的枚举(支持状态元信息)
为状态添加描述、编码或业务规则时,可声明私有字段、构造器和 getter:
立即学习“Java免费学习笔记(深入)”;
public enum OrderStatus {
CREATED(1, "已创建"),
PAID(2, "已支付"),
SHIPPED(3, "已发货"),
DELIVERED(4, "已签收"),
CANCELLED(-1, "已取消");
private final int code;
private final String desc;
OrderStatus(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() { return code; }
public String getDesc() { return desc; }
}
这样既能用 OrderStatus.PAID.getCode() 获取状态码,也便于日志输出或前端展示。
在枚举中封装状态判断逻辑
把判断逻辑写进枚举内部,比外部 if-else 或 switch 更内聚、更易维护:
- 定义布尔方法,例如
isFinal()判断是否为终态:
public enum OrderStatus {
CREATED(1, "已创建", false),
PAID(2, "已支付", false),
SHIPPED(3, "已发货", false),
DELIVERED(4, "已签收", true),
CANCELLED(-1, "已取消", true);
private final int code;
private final String desc;
private final boolean isFinal;
OrderStatus(int code, String desc, boolean isFinal) {
this.code = code;
this.desc = desc;
this.isFinal = isFinal;
}
public boolean isFinal() {
return isFinal;
}
public boolean canBeRefunded() {
return this == PAID || this == SHIPPED;
}
}
- 调用示例:
if (status.isFinal()) { ... }或if (status.canBeRefunded()) { ... } - 避免在业务代码里硬写
status == OrderStatus.DELIVERED || status == OrderStatus.CANCELLED,把规则收口到枚举中
安全地从外部值反查枚举(防 NPE 和非法输入)
常见需求:根据数据库存的字符串或整型状态码转成枚举。建议加一层静态查找方法,处理异常情况:
public enum OrderStatus {
// ... 同上
public static OrderStatus fromCode(int code) {
for (OrderStatus status : values()) {
if (status.code == code) {
return status;
}
}
throw new IllegalArgumentException("Unknown order code: " + code);
}
public static OrderStatus fromString(String str) {
try {
return valueOf(str.trim().toUpperCase());
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Unknown order status: " + str);
}
}
}
使用时可结合 Optional 或 try-catch 做容错,比如 Web 层接收参数后先校验再转换,防止传入非法值导致服务崩溃。


















