用接口定义状态机流转边界,核心是分离“状态能做什么”与“状态间如何切换”:orderstate接口声明合法操作,具体状态类实现并校验非法调用;orderstatus枚举显式限定允许的流转路径;ordercontext统一管理状态切换与业务解耦。

用接口定义状态机的流转边界,核心是把“状态能做什么”和“状态之间怎么切换”明确分离。Java 接口本身不能存状态、不能有实现逻辑,但它非常适合做契约声明——让每个状态类只专注自己允许的操作,让上下文(如订单)只通过接口与状态交互,从而天然约束非法流转。
用状态接口统一声明行为契约
定义一个 OrderState 接口,只包含当前状态下合法的操作方法,不暴露任何状态变更逻辑:
public interface OrderState {
void confirm(OrderContext context); // 已下单 → 已确认
void pay(OrderContext context); // 已确认 → 已支付
void ship(OrderContext context); // 已支付 → 已发货
void cancel(OrderContext context); // 多数状态都可能取消,但行为不同
void refund(OrderContext context); // 仅部分状态允许退款
}
每个具体状态(如 PendingState、ConfirmedState)实现该接口,并在非法调用时抛出 IllegalStateException。例如:
– PendingState.pay() 直接 throw 异常(未确认不能支付);
– ShippedState.cancel() 可能转为 CancelledAfterShippedState,而非拒绝。
用状态工厂+枚举限定合法流转路径
接口管“能做什么”,枚举管“能变成谁”。定义一个 OrderStatus 枚举,显式列出所有状态及它们的后继状态:
public enum OrderStatus {
PENDING(Set.of(CONFIRMED)),
CONFIRMED(Set.of(PAID, CANCELLED)),
PAID(Set.of(SHIPPED, REFUNDED, CANCELLED)),
SHIPPED(Set.of(DELIVERED, RETURNED)),
DELIVERED(Set.of()),
CANCELLED(Set.of()),
REFUNDED(Set.of());
private final Set<orderstatus> allowedNext;
OrderStatus(Set<orderstatus> allowedNext) {
this.allowedNext = Collections.unmodifiableSet(allowedNext);
}
public boolean canTransitionTo(OrderStatus next) {
return this.allowedNext.contains(next);
}
}
</orderstatus></orderstatus>
状态切换前,在 OrderContext 中校验:
– 调用方传入目标状态(如 order.transitionTo(OrderStatus.PAID));
– 上下文先查 currentState.canTransitionTo(target);
– 仅当允许,才委托给目标状态的初始化逻辑(如加载对应实现类)。
用上下文隔离状态实现与业务耦合
OrderContext 是唯一持有当前状态引用、且对外暴露操作入口的类。它不暴露状态对象本身,也不让外部直接 new 状态实例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 所有状态实现类设为包私有(
package-private),避免被误用; - 状态切换通过
transitionTo(OrderStatus)统一入口,内部用工厂或 switch 获取新状态实例; - 业务代码只调用
order.confirm()这类语义方法,背后由当前状态接口方法驱动,再触发上下文的状态更新。
这样,订单实体无需知道 ConfirmedState 的存在,状态类也不依赖订单字段——依赖倒置,边界清晰。
补充:用注解或编译期检查强化约束(可选)
若团队对规范性要求高,可自定义注解标记状态流转规则:
@AllowedTransitions({CONFIRMED, CANCELLED})
public class PendingState implements OrderState { ... }
配合注解处理器或单元测试反射扫描,自动校验所有状态的 @AllowedTransitions 是否与 OrderStatus 枚举定义一致,防止人工疏漏。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










