Kotlin Reference: Data Classes

  我们经常会创建一些仅用于存储数据的类,在这些类中,通常会根据数据派生出一系列标准的功能。Kotlin 称之为数据类(Data Class),使用 data 标记:

[code lang=”kotlin”]data class User(val name: String, val age: Int)[/code]

  编译器会自动根据主构造器中声明的所有属性,为数据类生成以下成员:

  • equals() / hashCode() 对,
  • toString(),形式为 "User(name=John, age=42)"
  • 按顺序对应每一个属性的 componentN() 函数
  • copy() 函数(见下)。

  如果以上函数已经在类中显式地声明,或者已从基类中继承得到,则不会自动生成该函数。

  为了确保生成代码的一致性,并具有有意义的行为,数据类必须满足一下要求:

  • 主构造器必须至少有一个参数;
  • 主构造器的所有参数必须标记为 valvar
  • 数据类不能为 abstractopensealedinner
  • (在 1.1 版本之前)数据类只能实现接口。

  从 1.1 版本起,数据类可以继承其他类(例子见 密封类)。

  在 JVM 平台,如果希望生成的类具有一个无参构造器,则主构造器的所有参数必须都有默认值,详见 构造器

[code lang=”kotlin”]data class User(val name: String = “”, val age: Int = 0)[/code]

Copying

  我们经常需要把对象复制一份,修改其中的部分属性,而不改变其他属性,copy() 函数就是用于这种场景。对于上面的 User 类,它的 copy() 函数实现如下:

[code lang=”kotlin”]fun copy(name: String = this.name, age: Int = this.age) = User(name, age)[/code]

【注】注意 copy() 的参数都有对象本身的值作为默认值。

  于是我们可以这样写:

[code lang=”kotlin”]val jack = User(name = “Jack”, age = 1)
val olderJack = jack.copy(age = 2)[/code]

Data Classes and Destructuring Declarations

  数据类也会生成一系列成分函数(Component Function),以用于解构声明(Destructuring Declaration):

[code lang=”kotlin”]val jane = User(“Jane”, 35)
val (name, age) = jane
println(“$name, $age years of age”) // prints “Jane, 35 years of age”[/code]

Standard Data Classes

  标准库提供了 PairTriple。但在大多数情况下,最好使用命名数据类,因为有意义的名字和属性可以提供更好的可读性。