8.1 Kotlin Sealed类

文章目录

    • 密封类声明
    • 密封类的必要性
    • Kotlin 密封类示例

  • 密封(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

你可能感兴趣的:(Kotlin发现之旅)