java中用变量记录状态,通过switch或if-else响应事件实现轻量状态机;推荐枚举定义状态、封装transitionto方法、按状态建内部类以提升可维护性。

Java 中用流程控制实现简单状态机,核心是用变量记录当前状态,再通过 if-else 或 switch 根据输入事件决定状态转移和对应行为。不需要引入复杂框架,适合轻量逻辑(比如按钮点击状态、协议解析阶段、表单填写步骤等)。
用枚举定义状态 + switch 实现清晰转移
枚举让状态名语义明确、类型安全,配合 switch 可读性高:
- 先定义状态枚举,例如:
enum State { IDLE, CONNECTING, CONNECTED, ERROR } - 用一个变量(如
private State currentState = State.IDLE)保存当前状态 - 提供触发方法(如
handleEvent(Event event)),内部用switch (currentState)分支处理不同状态下对同一事件的响应 - 每个分支内判断事件类型,更新
currentState并执行动作(如打印日志、调用回调)
用 if-else 处理带条件的状态迁移
当迁移逻辑依赖多个变量(如超时、校验结果、网络返回码),if-else 更灵活:
- 例如:从
CONNECTING迁移时,需同时检查isTimeout()和response.isValid() - 把迁移条件写在
if条件中,避免把所有逻辑硬塞进switch的某个 case - 建议把迁移条件封装成小方法(如
canTransitionToConnected()),提升可读性和复用性
封装状态转移逻辑,避免状态散落在各处
直接在业务方法里改 currentState 容易出错。推荐集中管理:
- 定义私有方法
transitionTo(State newState),统一做日志、前置检查(如禁止非法跳转) - 或为每个状态建内部类(如
IdleState),实现onEvent()方法,把行为和迁移逻辑绑定 - 这样新增状态或修改迁移规则时,只需动一个地方,不易漏掉副作用(如清理资源)
加个简单例子:登录流程状态机
三个状态:UNSUBMITTED(初始)、SUBMITTING(提交中)、LOGGED_IN(成功);事件只有 SUBMIT 和 LOGIN_SUCCESS:
- 收到
SUBMIT且当前是UNSUBMITTED→ 切到SUBMITTING,发起网络请求 - 收到
LOGIN_SUCCESS且当前是SUBMITTING→ 切到LOGGED_IN,跳转主页 - 其他组合(如
SUBMIT在LOGGED_IN状态)可忽略或报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











