- 数据类声明,
data
关键字- copy函数使用
- 数据类解构
-
提示:
Any
是 kotlin 所有类的根类,kotlin 中所有的类都直接或间接的继承Any
类。
作为数据类型,往往要重写 equals、hashCode 和 toString;虽然不是很麻烦,但当有很多属性时,代码量还是会很多,kotlin 语言设计中考虑到这一点,为此提供了一种数据类 (Data Classes)。
一、数据类声明, data 关键字
数据类声明很简单,只需要在类头 class 前面加上 data 关键字。
data class 类名(属性...)
例如:
data class User(val name: String, var password: String)
- 添加 data 关键字后 User 类变成了数据类,事实上他的底层会重写 Any 的三个函数,并增加一个 copy 函数。equals 函数的重写就是如所有属性全部相等, equals 才返回 true。
提示:使用 data 声明数据类的主构造函数中,参数一定要声明为 val 或 var,不能省略。
二、copy函数使用
数据类中提供了一个 copy 函数,通过 copy 函数可以复制一个新的数据类对象。
fun main(args: Array<String>) {
val user1 = User("小三", "123")
val user2 = user1.copy(name = "小四")
val user3 = user1.copy()
println(user1 == user2) // false
println(user1 == user3) // true
println(user1.toString()) // User (name=小三, password=123)
println(user2.toString()) // User (name=小四, password=123)
println(user3.toString()) // User (name=小三, password=123)
println(user1.hashCode()) // 81083983
println(user2.hashCode()) // 2662763
println(user3.hashCode()) // 81083983
}
三、数据类解构
数据对象是一个数据容器,可以理解为多个相关数据被打包到一个对象中。结构则进行相反的操作,是将数据对象拆开,然后将内部的属性取出,赋值给不同的变量。结构不仅仅适用于数据对象,也适用于集合对象。
fun main(args: Array<String>) {
val user1 = User("小三", "123")
val(name1, pwd1) = user1
println(name1) // 小三
println(pwd1) // 123
val(name2, _) = user1 // 省略解构 password 1️⃣
println(name2) // 小三
val(name3) = user1 // 2️⃣
println(name3) // 小三
}
代码第1️⃣2️⃣行也是对 user1 对象进行解构,其中第1️⃣行代码中的下划线 _
代表不需要结构第二个属性值;而代码第2️⃣行只有一个 name3,对于这种解构参数小于数据类属性个数的情况,解构规则按照数据类构造属性顺序解构。
补充:Json序列化框架Gson、Moshi、Kotlinx.serialization。
Gson | Moshi | K.S | |
---|---|---|---|
空类型 | 否 | 反射、注解 | 是 |
默认值 | 否 | 反射、注解 | 是 |
init块 | NoArg插件 | 反射、注解 | 是 |
Java类 | 是 | 是 | 否 |
Kotlin类 | 否 | 是 | 是 |
跨平台 | 否 | 否 | 是 |
网友评论