DevCN
菜单
全部文章快讯开发科技深度热点

Kotlin 密封类型:让解析结果携带错误原因

用密封接口表示成功和失败,通过 when 穷尽处理,让分钟数与错误原因只出现在各自合法的状态中。


本节目标

用密封接口表示成功和失败,通过 when 穷尽处理,让分钟数与错误原因只出现在各自合法的状态中。

环境与运行方法

准备 JDK 和 Kotlin/JVM 编译器。保存为 Lesson.kt,执行 kotlinc Lesson.kt -include-runtime -d lesson.jar,然后运行 java -jar lesson.jar。示例使用 Kotlin 2.x 的稳定基础语法。

核心思路

null 只能表达没有结果,不便区分失败原因。密封类型给出一组受限制的实现,让编译器帮助检查状态分支。本例把格式和范围错误分别写入 Failure。

完整示例

sealed interface Parsed {
    data class Value(val minutes: Int) : Parsed
    data class Failure(val reason: String) : Parsed
}
fun parse(text: String): Parsed {
    val value = text.toIntOrNull() ?: return Parsed.Failure("format")
    return if (value in 0..1440) Parsed.Value(value) else Parsed.Failure("range")
}
fun main() {
    for (text in listOf("30", "bad", "1441")) {
        val label = when (val result = parse(text)) {
            is Parsed.Value -> "ok=" + result.minutes
            is Parsed.Failure -> "error=" + result.reason
        }
        println(label)
    }
}

预期输出

ok=30
error=format
error=range

逐步理解

Value 只带分钟数,Failure 只带原因,不会出现失败状态还附带一个看似可用数值的矛盾结构。when 是表达式,分支结果直接生成 label。

新增实现时,缺少处理的 when 会得到编译提示。原因字符串适合小例子,稳定协议可以改成枚举或独立类型。类型系统不保证业务上限正确,边界测试仍然必要。

常见问题与边界

  • 宽泛 else 可能掩盖新增状态遗漏。
  • 展示文案不一定适合作为稳定错误码。
  • 不要为了方便把所有字段都设为可空。

动手练习

加入 "0",再增加空文本的专用原因。

参考答案

零返回 Value(0)。空文本可在解析前返回 Failure("empty");若新增密封实现,还应补全 when 分支来维持穷尽处理。

下载推广海报

文章推广海报

《Kotlin 密封类型:让解析结果携带错误原因》完整推广海报
DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。