高阶函数与方法引用结合是重构超大型复杂业务状态机最轻量又最有力的组合,它不依赖框架、无运行时开销,将状态流转逻辑从if/else转为声明式配置,使规则清晰、可读、可测、可插拔。

高阶函数与方法引用结合,是重构超大型复杂业务状态机最轻量又最有力的组合之一。它不依赖额外框架,不引入运行时开销,却能把状态流转逻辑从“写死在 if/else 里”变成“声明在配置中”,让状态转移规则清晰、可读、可测、可插拔。
用高阶函数封装状态转移行为
每个状态的处理逻辑本质是“收到某事件 → 执行动作 → 返回新状态”。这恰好对应一个函数签名:(currentState, event) → newState。你可以把不同状态下的响应行为抽成独立函数,并通过高阶函数统一调度:
- 定义通用处理器:
fun handleState(state: State, event: Event, handler: (State, Event) -> State): State - 为每种状态编写专用处理函数,如
handlePaidState、handleShippedState,它们只关注自身职责 - 用方法引用直接传入:
handleState(current, event, ::handlePaidState),避免匿名函数冗余
用方法引用替代硬编码分支
传统状态机常靠 switch 或 map 查表跳转,容易散落、难追踪。改用方法引用 + 状态类型映射,可让跳转逻辑集中且类型安全:
- 建立状态类到处理函数的映射:
mapOf(Paid::class to ::onPaidEvent, Shipped::class to ::onShippedEvent) - 调用时直接解包执行:
handlers[state::class]?.invoke(state, event) - IDE 能跳转、能提示、能重构,编译期就检查函数签名是否匹配
用高阶函数组合副作用与状态更新
真实业务中,状态切换往往伴随日志、MQ 发送、外部调用等副作用。与其混在状态处理函数里,不如用高阶函数分离关注点:
- 写一个装饰器:
fun withSideEffects(handler: (State, Event) -> State, sideEffect: (State, Event) -> Unit): (State, Event) -> State - 内部先执行原 handler 得到新状态,再触发副作用,最后返回新状态
- 按需组合:
withSideEffects(::handlePaidState, ::logPayment) andThen ::updateInventory
用泛型高阶函数统一事件分发入口
面对几十个事件类型(如 PayEvent、CancelEvent、RefundEvent),手动 if 判断易出错。可定义泛型分发函数:
inline fun <reified e : event> dispatch(event: E, state: State, crossinline handler: (State, E) -> State): State</reified>- 调用时自动推导类型:
dispatch(payEvent, state, ::handlePay),类型安全,无反射开销 - 配合方法引用,每个事件处理器天然绑定其专属事件子类型
这种组合不追求大而全的状态机框架,而是用语言原生能力把状态逻辑“拎出来、标清楚、串起来”。重构后,新增一个状态或事件,只需加一个函数、注册一次引用,主流程不动,测试边界清晰,团队协作成本大幅降低。

















