java继承不直接构建状态机,而是通过抽象父类封装通用状态行为、子类分治实现具体状态逻辑、final约束保障不可变性、工厂方法统一创建实例、纯函数式决策避免数据持有,从而支撑秒杀业务高内聚、高可用、易维护的状态流转。

Java继承机制本身不直接构建状态机,但它能为秒杀业务中可复用、可扩展的状态流转逻辑提供清晰的类结构基础。关键不是“用继承实现状态机”,而是用继承组织状态行为——把共性状态抽象为父类,把差异化处理下沉到子类,从而在保证高内聚的同时支撑高可用所需的可维护性与可替换性。
状态抽象:用父类封装通用生命周期行为
秒杀流程本质是有限状态转换:待开始 → 进行中 → 已结束 → 已售罄 → 已关闭。这些状态共享基础能力:校验时效性、判断是否可抢、记录变更时间、触发事件回调。把这些共性抽成抽象父类(如 SeckillState),定义模板方法 canParticipate()、onTransition() 和受保护的钩子方法 doPreCheck()、doAfterCommit()。子类只需关注自己负责的状态分支逻辑,不重复写时间判断或日志埋点。
子类分治:按业务语义划分状态实现
每个具体状态对应一个不可变的子类,例如:
- WaitingState:只允许检查倒计时,拒绝扣库存;重写 canParticipate() 返回 false,但开放 onStart() 触发切换
- ActiveState:核心抢购态;重写 doPreCheck() 调用 Redis Lua 原子查库存,doAfterCommit() 发送 MQ 创建订单
- SoldOutState:主动拦截后续请求;canParticipate() 永远返回 false,并记录“已售罄”指标
这种设计让每个子类职责单一、边界明确,修改某状态逻辑不影响其他状态,天然支持高内聚。
运行时安全:用 final + 构造约束防止误用
状态对象应不可变且无状态(stateless)。父类声明为 abstract,所有子类用 final 修饰,禁止进一步继承。构造函数设为 private 或包私有,仅通过工厂方法(如 SeckillState.of(timestamp, stock))统一创建。工厂内部根据当前时间和库存自动返回对应子类实例——业务层完全无需关心 new 哪个类,只调用 state.canParticipate() 即可。
与分布式协同:状态机不持数据,只做决策
真正的库存、用户资格、订单ID等都存在 Redis 或 DB 中。状态机只读取必要字段(如 startTime、stock、endTime),不做任何写操作。它像一个纯函数式决策器:输入当前上下文,输出“允许/拒绝/跳转”。这样状态机实例可全局单例复用,无并发安全问题,也便于水平扩展——多个服务节点加载同一套状态类,行为完全一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











