密封类用来表示受限的类继承结构:当一个值为有限几种的类型、而不能有任何其他类型时。在某种意义上,他们是枚举类的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例。
以下代码用来表示网络状态的密封类
sealed class LoadState(val msg: String) {
class Loading(msg: String = "") : LoadState(msg)
class Success(msg: String = "") : LoadState(msg)
class Fail(msg: String) : LoadState(msg)
}
一个密封类是自身抽象的,它不能直接实例化并可以有抽象(abstract)成员。
密封类不允许有非-private 构造函数(其构造函数默认为 private)。
扩展密封类子类的类(间接继承者)可以放在任何位置,而无需在同一个文件中
使用密封类的关键好处在于使用 when
表达式的时候
viewModel.loadState.observe(this, Observer {
when (it) {
is LoadState.Success -> {
}
is LoadState.Fail -> {
}
is LoadState.Loading -> {
}
}
})