应用场景
经常会需要创建一些类除了保存数据不干其他事情,比如我们解析网络请求下来的数据。Kotlin就提供了一个非常方便的class—— data class
长什么样儿?
data class User(val name: String, val age: Int)
我们知道在Kotlin中,声明类的同时可以方便的直接声明构造方法等参数,鉴于data class只是存放数据,那么只一个构造方法足矣,所以连类的body也就不需要了。是不是很清爽?
data class为我们做了什么
编译器会根据我们在构造函数里声明的属性自动导出下列成员:
-
equals() /hashCode()
对儿 toString() // e.g.: "User(name=Jone, age=12)"
componentN()
-
copy()
如果在类里面明确定义或者继承了上面的基础方法,则不会再自动生成
规则
- 基础构造函数需要至少有一个参数
- 所有基础构造函数的参数都必须用val或者var标记
- data class不可以是abstract, open, sealed or inner
- 不可以实现接口
- 因为对于JVM,一个类要有无参构造函数,那么这个类的所有属性都必须指定好,比如
data class User(val name: String = "", val age: Int = 0)
拷贝
经常会遇到我们只需要替换一个对象的个别属性,而其他属性保留的情况。这就是data class中生成的copy函数的作用了。
本文已开始的例子类,它的生成的默认copy函数是下面这样的:
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)
data class的结构化声明
data class的生成的component方法给我们的结构化声明及使用提供了可能
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age") // prints "Jane, 35 years of age"