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 分支来维持穷尽处理。
文章回复
0 条公开回复