Kotlin之data class [数据类]
kotlin正常声明一个类的方式class [类名],与java类似
kotlin对类的声明还可以用data关键字来标记那些只用来保存数据的类,将其称之为数据类
eg:
data class User constructor(val name: String) {
var nickName: String = ""
}
例如上面的user类就是声明的一个数据类
数据类的声明必须满足下列的要求:
-
主构造函数至少需要有一个参数 -
主构造函数的所有参数必须要标记为val或者var -
数据类不能是抽象、开发、密封或者内部的
为什么data class要有上面的约束呢?
我们来看下声明一个普通的class类,满足上面的要求和不满足上面的要求存在什么差别
```kotlin
class User constructor(name: String) {
}
class User constructor(name1: String) {
var name: String = ""
init {
name = name1
}
}
class User constructor(var name: String) {
}
所以上面的限制要求使数据类在主构造函数声明了包含的成员变量,然后编译器通过这些声明的成员变量为我们生成了一些特定的功能。
官方文档也指出:
对于data class编译器自动从主构造函数中声明的所有属性导出以下成员:
equals() /hashCode() 对;toString() 格式是 "User(name=John, age=42)" ;componentN() 函数 按声明顺序对应于所有属性;copy() 函数
也就是data生成的equals、hashCode、toString方法都是根据主构造函数中声明的成员变量来完成对应实现的。
可以看如下例子:
data class User constructor(var name: String) {
var nickName: String = ""
}
val user1 = User("Lance")
user1.nickName = "ming"
val user2 = User("Lance")
user2.nickName = "ning"
user1==user2 因为equals、hashCode都是根据name,即此处赋值的Lance去比较的
同时user1、user2的toString方法返回均为User(name=Lance)
如果修改上面的code为
data class User constructor(var name: String, var nickName: String) {
}
val user1 = User("Lance", "ming")
val user2 = User("Lance", "ning")
user1!=user2 因为equals、hashCode都是根据name和nickName去比较的
同时user1、user2的toString方法返回分别为User(name=Lance,nickName=ming)、User(name=Lance,nickName=ning)
|