Java枚举类型适合实现状态机,因其具备有限、明确、不可变特性;通过添加字段、构造器、业务方法(如canTransitionTo)可封装状态行为与转移规则;结合状态机类统一管理流转,并支持为各状态定制差异化逻辑。

Java 枚举类型非常适合实现状态机逻辑,因为枚举天然具备有限、明确、不可变的取值特性,配合方法和字段,能清晰封装每个状态的行为与转移规则。
定义基础枚举状态
先定义一个表示订单生命周期的状态枚举,每个常量代表一个确定的状态:
public enum OrderStatus {
CREATED,
PAID,
SHIPPED,
DELIVERED,
CANCELLED
}
这只是一个“标记型”枚举,适合简单场景。若要驱动状态机,需增强其能力。
为枚举添加状态行为与转移逻辑
在枚举中声明字段(如描述、是否终态)、构造器,并定义业务方法(如 canTransitionTo 或 next):
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public enum OrderStatus {
CREATED("已创建", false),
PAID("已支付", false),
SHIPPED("已发货", false),
DELIVERED("已签收", true),
CANCELLED("已取消", true);
private final String description;
private final boolean isTerminal;
OrderStatus(String description, boolean isTerminal) {
this.description = description;
this.isTerminal = isTerminal;
}
public boolean canTransitionTo(OrderStatus next) {
return switch (this) {
case CREATED -> next == PAID || next == CANCELLED;
case PAID -> next == SHIPPED || next == CANCELLED;
case SHIPPED -> next == DELIVERED || next == CANCELLED;
case DELIVERED, CANCELLED -> false; // 终态不可转移
};
}
public String getDescription() { return description; }
public boolean isTerminal() { return isTerminal; }
}
这样,状态合法性检查就内聚在枚举内部,调用方只需写 orderStatus.canTransitionTo(newStatus),无需散落一堆 if-else。
结合状态机类统一管理状态流转
定义一个轻量状态机类,负责校验、执行转移并触发回调:
public class OrderStateMachine {
private OrderStatus currentState;
public OrderStateMachine(OrderStatus initialState) {
this.currentState = initialState;
}
public boolean transitionTo(OrderStatus target) {
if (currentState.canTransitionTo(target)) {
// 可选:执行前置/后置逻辑,如日志、事件发布
System.out.println("状态从 " + currentState + " → " + target);
currentState = target;
return true;
}
return false;
}
public OrderStatus getCurrentState() { return currentState; }
}
使用时:
OrderStateMachine sm = new OrderStateMachine(OrderStatus.CREATED); sm.transitionTo(OrderStatus.PAID); // ✅ 成功 sm.transitionTo(OrderStatus.DELIVERED); // ❌ 失败(不支持跳转)
进阶:为每个状态定制差异化行为
利用枚举的抽象方法,让每个常量自行实现其专属逻辑,例如不同状态下的超时处理:
public enum OrderStatus {
CREATED {
@Override
public void onTimeout(OrderContext ctx) {
ctx.cancel(); // 创建后超时自动取消
}
},
PAID {
@Override
public void onTimeout(OrderContext ctx) {
ctx.refund(); // 支付后超时触发退款
}
},
DELIVERED {
@Override
public void onTimeout(OrderContext ctx) {
// 已签收,无需操作
}
};
public abstract void onTimeout(OrderContext ctx);
}
这种写法将策略分散到各状态中,扩展新状态时只需新增枚举项并实现方法,符合开闭原则。

















