Kotlin sealed
关键字介绍
sealed
是 Kotlin 中的一个重要关键字,用于声明密封类(Sealed Class),它是一种特殊的抽象类,用于表示受限的类层次结构。
基本概念
密封类的主要特点:
- 所有子类必须在同一文件中声明(Kotlin 1.1 之后可以放宽到同一模块)
- 密封类本身是抽象的,不能直接实例化
- 密封类的子类可以有实例(与枚举不同)
基本语法
kotlin
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
}
主要用途
- 替代枚举:当需要更复杂的类型时(枚举的每个实例都是相同的类型)
- 模式匹配 :与
when
表达式配合使用,可以实现完备的检查
kotlin
fun handleResult(result: Result) {
when (result) {
is Result.Success -> println("Success: ${result.data}")
is Result.Error -> println("Error: ${result.message}")
Result.Loading -> println("Loading...")
}
// 不需要 else 分支,因为所有可能性都已覆盖
}
与枚举的区别
特性 | 密封类 | 枚举类 |
---|---|---|
实例类型 | 可以有多个不同类的实例 | 所有实例都是同一类型 |
状态携带 | 可以携带不同数据 | 通常不携带数据 |
继承 | 支持继承 | 不支持继承 |
实例数量 | 子类可以有任意数量实例 | 每个枚举值都是单例 |
与抽象类的区别
- 密封类的所有子类在编译时已知
when
表达式处理密封类时,如果覆盖所有情况则不需要else
分支- 子类必须与密封类在同一模块中
Kotlin 1.5 的改进
Kotlin 1.5 引入了密封接口(Sealed Interface),允许更灵活地构建层次结构:
kotlin
sealed interface Error
sealed class IOError : Error {
// ...
}
实际应用场景
- 状态管理(如 UI 状态、网络请求结果)
- 表达式树(如编译器中的 AST 节点)
- 命令模式中的命令类型
- 事件处理系统中的不同事件类型
密封类是 Kotlin 中表达受限类层次结构的强大工具,能够提供更好的类型安全和更清晰的代码结构。