返回

Kotlin 密封类进化了!

Android

Kotlin密封类进化了!

Kotlin 1.5 给 Sealed Classes 和 Sealed Interface 都带来了那些改变

Kotlin 密封类(Sealed Class)是一种受限的类,它可以防止在类层次结构中创建任意的新子类。换句话说,密封类只能通过定义在它内部的子类来进行扩展。

在 Kotlin 1.5 之前,密封类被认为只是一个语法糖,本质上就是 Kotlin 接口的变种。这意味着在 Kotlin 1.5 中,密封类通常不会生成任何特殊的字节码,只是将其编译为普通的 Kotlin 类。但是 Kotlin 1.5 改变了这一点。

Kotlin 1.5 将密封类升级为一种特殊的类,在编译时会生成特殊的字节码。这意味着,密封类与 Java 的枚举类有更多的相似之处。

密封类的变化

密封类在 Kotlin 1.5 中主要有以下变化:

  • 密封类现在可以定义伴生对象,并且可以在伴生对象中定义属性和方法。
  • 密封类现在可以在构造函数中使用 when 表达式来初始化属性。
  • 密封类现在可以实现接口,并且可以重写接口中的方法。
  • 密封类现在可以声明抽象方法,并且可以被子类实现。
  • 密封类现在可以被其他类继承,并且可以重写密封类中的方法。

密封接口的变化

密封接口在 Kotlin 1.5 中主要有以下变化:

  • 密封接口现在可以定义伴生对象,并且可以在伴生对象中定义属性和方法。
  • 密封接口现在可以在构造函数中使用 when 表达式来初始化属性。
  • 密封接口现在可以继承其他接口,并且可以重写接口中的方法。
  • 密封接口现在可以声明抽象方法,并且可以被实现类实现。

何时使用密封类和密封接口

密封类和密封接口通常在以下情况下使用:

  • 当您想要创建一个类型层次结构,并且希望确保该层次结构不会在将来被扩展时。
  • 当您想要创建一个类型层次结构,并且希望确保该层次结构中的所有类型都具有相同的行为时。
  • 当您想要创建一个类型层次结构,并且希望确保该层次结构中的所有类型都具有相同的属性时。
  • 当您想要创建一个类型层次结构,并且希望确保该层次结构中的所有类型都可以相互比较时。

规则

  • 密封类和密封接口的子类必须全部定义在密封类或密封接口内部。
  • 密封类和密封接口的子类不能定义在其他类或接口内部。
  • 密封类和密封接口的子类不能是内部类。
  • 密封类和密封接口的子类不能是匿名类。

性能

在 Kotlin 1.5 中,密封类和密封接口的性能得到了显著的提高。这是因为,密封类和密封接口现在在编译时会生成特殊的字节码,而不是像以前那样只生成普通的 Kotlin 类。

效率

在 Kotlin 1.5 中,密封类和密封接口的效率也得到了显著的提高。这是因为,密封类和密封接口现在可以被其他类继承,并且可以重写密封类和密封接口中的方法。这意味着,您可以在密封类和密封接口中定义通用的行为,然后在子类中重写这些行为,以适应不同的需求。

兼容性

Kotlin 1.5 中的密封类和密封接口与以前的版本是兼容的。这意味着,您可以在 Kotlin 1.5 中使用以前的版本的密封类和密封接口,反之亦然。