Kotlin面向对象 (5)✔️数据类

2019-05-30  本文已影响0人  狼性代码人
  • 数据类声明, data 关键字
  • copy函数使用
  • 数据类解构

作为数据类型,往往要重写 equalshashCodetoString;虽然不是很麻烦,但当有很多属性时,代码量还是会很多,kotlin 语言设计中考虑到这一点,为此提供了一种数据类 (Data Classes)

一、数据类声明, data 关键字

数据类声明很简单,只需要在类头 class 前面加上 data 关键字。

data class 类名(属性...)

例如:

data class User(val name: String, var password: String)

提示:使用 data 声明数据类的主构造函数中,参数一定要声明为 valvar,不能省略。

二、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,对于这种解构参数小于数据类属性个数的情况,解构规则按照数据类构造属性顺序解构。


\color{#FF0000}{注意:数据类作为Java Bean 使用要注意2点:}

\color{#FF0000}{1、数据类没有主构造函数,可以使用NoArg插件解决。}
\color{#FF0000}{注意配置NoArg参数,最好设置invokeInitializers=true,}
\color{#FF0000}{这样反序列化时会执行对象的init块代码}

\color{#FF0000}{2、数据类本身及属性都是final修饰 不能被继承,可以使用AllOpen插件解决。}

\color{#FF0000}{最常见的使用这两个插件的地方就是,数据类的序列化}


补充:Json序列化框架Gson、Moshi、Kotlinx.serialization。

Gson Moshi K.S
空类型 反射、注解
默认值 反射、注解
init块 NoArg插件 反射、注解
Java类
Kotlin类
跨平台
上一篇 下一篇

猜你喜欢

热点阅读