sealed 关键字
1、基本介绍
-
sealed 用来定义密封类,作用是限制子类的类型
-
把类声明为 sealed,它的子类只能定义在同一个文件里
-
相当于告诉编译器:可能的子类就这几种,不会再有别的
-
配合 when 表达式,可以不用写 else,因为编译器知道所有可能的情况
| 维度 | 使用 sealed 关键字 | 不使用 sealed 关键字 |
|---|---|---|
| 子类位置 | 只能在同一个文件 | 任意地方 |
| when 表达式 | 可以省略 else | 需要 else |
| 扩展性 | 子类集合固定,外部不能新增 | 外部可以随意新增 |
2、演示
- 使用 sealed 关键字
kotlin
sealed class Result
data class Success(val data: String) : Result()
data class Error(val msg: String) : Result()
object Loading : Result()
fun handle(result: Result) = when (result) {
is Success -> println("数据:${result.data}")
is Error -> println("错误:${result.msg}")
Loading -> println("加载中")
}
- 不使用 sealed 关键字
kotlin
open class Result
data class Success(val data: String) : Result()
data class Error(val msg: String) : Result()
object Loading : Result()
fun handle(result: Result) = when (result) {
is Success -> println("数据:${result.data}")
is Error -> println("错误:${result.msg}")
Loading -> println("加载中")
else -> println("未知")
}
- 不使用 sealed 关键字,如果不写 else,会编译失败
kotlin
open class Result
data class Success(val data: String) : Result()
data class Error(val msg: String) : Result()
object Loading : Result()
fun handle(result: Result) = when (result) {
is Success -> println("数据:${result.data}")
is Error -> println("错误:${result.msg}")
Loading -> println("加载中")
}
# 输出结果
'when' expression must be exhaustive. Add an 'else' branch.