概述
在开发过程中,经常会创建一些数据里,其没有任何逻辑功能,仅仅来用来保存数据。在Kolin中,将这些类统一称为数据类,用关键字data标记。
data class User(val name: String, val age: Int)
编译器会根据主构造器中声明的全部属性, 自动推断产生以下成员函数:
- equals()/hashCode()函数对,
- toString() 函数, 输出格式为 “User(name=John, age=42)” ,
- componentN() 函数群, 这些函数与类的属性对应, 函数名中的数字 1 到 N, 与属性的声明顺序一致,
- copy() 函数
如果在该数据类或者基类中重写了以上某个成员函数,将不会再自动推断,以重写的为准。
数据类的声明条件
- 主构造器至少要有一个参数;
- 主构造器的所有参数必须标记为 val 或 var ;
- 数据类不能是抽象类、open 类、封闭(sealed)类、或内部(inner)类;
- 数据类不能继承自任何其他类(但可以实现接口);
如果数据类有无参构造函数,需将主构造函数中,将成员属性初始化。
data class User(val name: String = "", val age: Int = 0)
对象复制
之前提到,JVM会自动为一个数据类生成copy()函数。copy()到底用来干啥的?copy()是对对象的浅拷贝还是深拷贝?带着这些疑问往下看。
data class Person(va