- 密封(Sealed)类是一个限制类层次结构的类。
- 可以在类名之前使用sealed关键字将类声明为密封类。
- 它用于表示受限制的类层次结构。
- 当对象具有来自有限集的类型之一,但不能具有任何其他类型时,使用密封类。
- 密封类的构造函数在默认情况下是私有的,它也不能允许声明为非私有。
密封类声明
在类名之前使用sealed关键字将类声明为密封类。
sealed class MyColor {
}
密封类的子类必须在密封类的同一文件中声明。
sealed class MyColor {
class Yellow : MyColor()
class Red : MyColor()
class Black : MyColor()
}
密封类仅在编译时限制类型集来确保类型安全的重要性。
sealed class MyColor {
class Yellow : MyColor()
class Red : MyColor()
class Black : MyColor()
}
sealed class ColorA {
class White : MyColor() //不起作用,因为密封类在另一个范围内定义。
}
sealed class ColorB : MyColor() {
}
密封类隐式是一个无法实例化的抽象类。
sealed class MyColor()
fun main(args: Array<String>) {
val color = MyColor() //密封类型无法实例化
}
密封类的必要性
让我们首先了解密封类的必要性,下面的例子中,我们有一个类MyColor,它有三个子类Yellow、Red和Black。evals()方法中的when表达式必须使用else分支,否则我们会得到一个编译错误。
示例1:
open class MyColor {
class Yellow : MyColor()
class Red : MyColor()
class Black : MyColor()
}
fun evals(color: MyColor) = when (color) {
is MyColor.Yellow -> println("yellow")
is MyColor.Red -> println("red")
is MyColor.Black -> println("black")
else -> println("other") //必须包含else分支,否则编译错误
}
fun main(args: Array<String>) {
evals(MyColor.Black())
}
Kotlin 密封类示例
密封类通常与表达时一起使用。 由于密封类的子类将自身类型作为一种情况。 因此,密封类中的when表达式涵盖所有情况,从而避免使用else子句。
sealed class MyColor {
class Yellow : MyColor()
class Red : MyColor()
class Black : MyColor()
}
fun evals(color: MyColor) = when (color) {
is MyColor.Yellow -> println("yellow")
is MyColor.Red -> println("red")
is MyColor.Black -> println("black")
}
fun main(args: Array<String>) {
evals(MyColor.Black())
}
结果:black