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

Kotlin中能否获取when语句已处理的分支枚举值?

Kotlin枚举when分支动态生成错误提示

问题场景

现有如下Kotlin代码:

enum class Cat { Fat, Greedy, Sleepy, Lasagna }
...
when (cat) {
    Fat -> // 处理Fat分支
    Greedy -> // 处理Greedy分支
    else -> throw RuntimeException("You have a $cat cat - I don't know about those.")
}

需求是将错误提示改为"You have a $cat cat - I only know about Fat and Greedy",但希望新增when分支时无需手动更新提示文本,同时不想通过给枚举添加标记或分发式逻辑(如给枚举加lambda)的方式实现。核心疑问:是否能直接读取when语句中已处理的分支选项?

结论与解决方案

首先明确:没有办法直接读取when语句中已处理的分支选项。因为when是编译期语法结构,编译后会被转换为switch或if-else逻辑,运行时不会保留"哪些分支被处理过"的元数据。

不过可以通过以下方式实现需求,无需修改枚举本身,也能减少手动同步的工作量:

方案:复用已处理枚举值集合

定义一个包含所有已处理枚举值的集合,when分支和错误提示都依赖这个集合。新增分支时只需在集合和when中各添加一行,无需手动修改提示文本:

enum class Cat { Fat, Greedy, Sleepy, Lasagna }

fun processCat(cat: Cat) {
    // 维护这个集合,新增已处理分支时只需要在这里添加枚举值
    val handledCats = setOf(Cat.Fat, Cat.Greedy)
    
    when (cat) {
        Cat.Fat -> // 处理Fat分支
        Cat.Greedy -> // 处理Greedy分支
        else -> throw RuntimeException("You have a $cat cat - I only know about ${handledCats.joinToString(", ")}")
    }
}

如果想进一步减少重复代码,也可以将分支逻辑和集合绑定,用in关键字先判断,再嵌套when处理具体逻辑:

fun processCat(cat: Cat) {
    val handledCats = setOf(Cat.Fat, Cat.Greedy)
    
    when (cat) {
        in handledCats -> {
            when (cat) {
                Cat.Fat -> // 处理Fat分支
                Cat.Greedy -> // 处理Greedy分支
            }
        }
        else -> throw RuntimeException("You have a $cat cat - I only know about ${handledCats.joinToString(", ")}")
    }
}

这种方式既避免了修改枚举,也保证了错误提示会自动同步已处理的枚举值,无需手动拼接提示文本。

内容的提问来源于stack exchange,提问作者Tim Baverstock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:47:16