数据类
我们经常创建一些只是处理数据的类。在这些类里的标准功能经常是
衍生自数据。在Kotlin中,这叫做 数据类 并标记为data
:
data class User(val name: String, val age: Int)
编译器自动从在主构造函数定义的全部特性中得到以下成员:
equals()
/hashCode()
对,toString()
格式是"User(name=John, age=42)"
,componentN()
functions 对应按声明顺序出现的所有属性,copy()
函数(见下面)。
如果有某个函数被明确地定义在类里或者被继承,编译器就不会生成这个函数。
To ensure consistency and meaningful behavior of the generated code, data classes have to fulfil the following requirements:
- The primary constructor needs to have at least one parameter;
- All primary constructor parameters need to be marked as
val
orvar
; - Data classes cannot be abstract, open, sealed or inner;
- Data classes may not extend other classes (but may implement interfaces).
在JVM中,如果生成的类需要含有一个无参的构造函数,则所有的属性必须有默认值。 (查看 Constructors).
data class User(val name: String = "", val age: Int = 0)
复制
在很多情况下,我们我们需要对一些属性做修改而其他的不变。
这就是copy()
这个方法的来源。对于上文的User
类,应该是这么实现这个方法的
fun copy(name: String = this.name, age: Int = this.age) = User(name, age)
也可以这么写
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
数据类和多重声明
_成员方法_用于使数据类可以多声明:
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age") // prints "Jane, 35 years of age"
标准数据类
在标准库提供了Pair
和Triple
。在很多情况下,即使命名数据类是一个更好的设计选择,
因为这能让代码可读性更强。