Kotlin状态机枚举替换为多级继承密封类并直接获取OperationState方案
密封类改造方案
核心思路是将OperationState作为每个业务状态的固有属性,在密封类的抽象父层声明该属性,所有具体状态实例实现时直接绑定对应操作状态,无需额外写映射逻辑。
1. 基础结构定义
首先保留OperationState作为操作状态的枚举(如果后续需要扩展也可以改为密封类),顶层State密封类声明抽象的操作状态属性:
enum class OperationState { InProgress, Finished, Error } sealed class State { // 所有状态都必须绑定对应的操作状态 abstract val operationState: OperationState // 第一组业务状态 sealed class FirstState : State() { // 可以在组层设置默认值,仅特殊状态单独重写,简化代码 override val operationState: OperationState = OperationState.InProgress object A : FirstState() { override val operationState = OperationState.Error } object B : FirstState() object C : FirstState() object D : FirstState() { override val operationState = OperationState.Finished } } // 第二组业务状态 sealed class NextState : State() { // 按需实现各状态的operationState即可 object X : NextState() { override val operationState = OperationState.InProgress } object Y : NextState() { override val operationState = OperationState.Finished } // ...其他状态 } // 第三组业务状态 sealed class LastState : State() { // 按需实现各状态的operationState即可 object M : LastState() { override val operationState = OperationState.Error } object N : LastState() { override val operationState = OperationState.Finished } // ...其他状态 } }
2. 业务层使用
改造后不需要单独写changeXXXOperationState这类映射方法,直接通过状态实例的属性即可拿到对应操作状态:
when (state) { is State.FirstState -> { // 执行业务逻辑 val opState = state.operationState // 直接获取对应的操作状态 } is State.NextState -> { // 执行业务逻辑 val opState = state.operationState } is State.LastState -> { // 执行业务逻辑 val opState = state.operationState } }
进阶优化
如果不同状态组的业务逻辑可以抽象,还可以将业务方法也声明为State的抽象方法,每个子类自行实现,业务层连when分支都可以省略,直接调用方法即可。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

