Kotlin 数据类与密封类

· 约 4 分钟读完 · 第 32 / 46 章

简介

数据类在 Kotlin 中主要用于存储数据。当你需要定义一个对象来保存一些属性值时,使用数据类会非常方便。它会自动生成一些基本的方法,比如 equals()、hashCode()、toString() 和 copy() 方法。

定义数据类

定义一个数据类只需要在 class 关键字之前加上 data 关键字即可。例如:

上述代码将创建一个名为 Person 的数据类,该类有两个属性:name 和 age。

自动生成的方法

  • equals() 和 hashCode(): 这些方法基于所有属性值进行比较。
  • toString(): 返回一个格式化的字符串,内容为类名和所有属性值。
  • copy(): 允许你复制一个对象并修改其中的某些属性值。
  • componentN(): 生成用于解构声明的函数,这些函数的数量与属性数量相同。例如,对于上述的 Person 类,会有 component1() 和 component2() 方法,分别返回 name 和 age 属性。

使用示例

注意事项

  • 数据类不能继承其他类,因为其构造函数参数是公开的。
  • 数据类不能实现接口,因为它的所有成员都是 final 的。
  • 所有属性都应该是 val 类型,因为数据类不允许修改其状态。

密封类

简介

密封类是一种特殊的类,它可以被子类化,但所有子类必须在同一个文件中定义。这使得它们非常适合于表示有限的、已知的类型集合。

定义密封类

密封类使用 sealed 关键字定义。例如:

上述代码定义了一个名为 Result 的密封类,它有两个子类:Success 和 Failure。

使用密封类

密封类通常用于模式匹配,例如使用 when 表达式。例如:

特点

  • 密封类的所有子类必须在同一个文件中定义。
  • 密封类不能在其他地方实例化,只能通过其子类。
  • 密封类可以有效地模拟枚举类的行为,但提供了更多的灵活性,因为它可以有多个实例。

注意事项

  • 密封类通常用于表示有限的、已知的结果集,因此非常适合于处理响应式编程中的异步操作。
  • 要小心不要过度使用密封类,因为如果子类过多或逻辑复杂,可能会导致代码难以维护。

通过理解数据类和密封类,你可以更好地利用 Kotlin 的强大功能来构建高效且易于维护的应用程序。