You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:36:03