java中可用泛型实现类型安全、可复用的状态机转换器,通过参数化state、event、action,结合接口契约、map规则存储、fluent builder构建,确保编译期类型检查与运行时安全转换。

Java 中可以用泛型实现一个类型安全、可复用的状态机转换器,核心是把状态(State)、事件(Event)和动作(Action)都参数化,避免硬编码和运行时类型错误。
定义泛型状态机核心接口
先抽象出状态机的行为契约,明确“当前状态 + 事件 → 新状态 + 可选副作用”这个逻辑:
- State 和 Event 作为类型参数,确保状态跳转只在合法组合间发生
- 用
Function<event state></event>或自定义Transition<s e></s>表示单步转移逻辑 - 支持带副作用的转换:例如执行日志、校验、外部调用,可用
Consumer<event></event>或封装为Action<s e></s>
泛型转换器类:StateTransitioner
这是一个无状态的纯逻辑组件,负责根据当前状态、事件和预注册的规则,计算下一个状态并触发动作:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 内部用
Map<pair e>, TransitionRule<s e>></s></pair>存储转移规则(Pair可用AbstractMap.SimpleEntry或自定义轻量类) -
TransitionRule<s e></s>包含:nextState(目标状态)、action(执行逻辑,可为Runnable或Consumer<e></e>) - 提供
transition(S currentState, E event)方法,查表执行,找不到规则时抛出IllegalStateException或返回Optional.empty()
类型安全的构建方式:Fluent Builder
避免手动构造 Map,用泛型 builder 提供编译期检查:
- 定义
StateTransitionerBuilder<s e></s>,链式添加规则:when(state1).on(eventA).goTo(state2).andDo(...) - 每个
when(S)返回新 builder,绑定当前状态类型;on(E)绑定事件类型;goTo(S)确保目标状态与泛型 S 一致 - builder 最终生成不可变的
StateTransitioner<s e></s>,保障线程安全
实际使用示例:订单状态机
假设订单有 PENDING、CONFIRMED、CANCELLED 状态,事件为 ConfirmOrder、CancelOrder:
- 声明:
StateTransitioner<orderstate orderevent> machine = new StateTransitionerBuilder()</orderstate> - 配置规则:
.when(PENDING).on(ConfirmOrder).goTo(CONFIRMED).andDo(log::info) - 执行:
OrderState next = machine.transition(current, event);—— 编译器会阻止传入非法状态或事件
这样既复用逻辑,又保留强类型约束,不依赖字符串或枚举序号匹配,也不需要反射或注解处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










