Kotlin学习(六):Sealed Classes

何为密封类?

从文档得知:密封类用于表示受限类层次结构,此时值可以具有来自受限集的类型之一,但不能具有任何其他类型。从某种意义上说,它们是枚举类的扩展:枚举类型的值集也受到限制,但每个枚举常数仅作为单个实例存在,而密封类的子类可以具有多个实例,这些实例可以包含状态。

如何声明 sealed class?

只要在类名前加sealed修饰符。

1
2
3
4
5
6
7
sealed class Car {

data class Maruti(val speed: Int) : Car()
data class Bugatti(val speed: Int, val boost: Int) : Car()
object NotACar : Car()

}

当您在when表达式中使用密封类时,使用它们的关键好处就发挥了作用。如果验证语句覆盖所有情况,则不需要向语句中添加else子句。

1
2
3
4
5
6
fun speed(car: Car): Int = when (car) {
is Car.Maruti -> car.speed
is Car.Bugatti -> car.speed + car.boost
Car.NotACar -> INVALID_SPEED
// else clause is not required as we've covered all the cases
}

所以,当你遇到类似场景,考虑使用密封类。

龙颜大悦,朕要赏赐!