美文网首页
Kotlin面向对象 (5)✔️数据类

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

作者: 狼性代码人 | 来源:发表于2019-05-30 10:26 被阅读0次
  • 数据类声明, data 关键字
  • copy函数使用
  • 数据类解构
  • 提示: Any 是 kotlin 所有类的根类,kotlin 中所有的类都直接或间接的继承 Any 类。

作为数据类型,往往要重写 equalshashCodetoString;虽然不是很麻烦,但当有很多属性时,代码量还是会很多,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 声明数据类的主构造函数中,参数一定要声明为 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类
跨平台

相关文章

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

    数据类声明, data 关键字copy函数使用数据类解构 提示: Any 是 kotlin 所有类的根类,kotl...

  • Kotlin——面向对象

    Kotlin面向对象 类和对象 Kotlin提供了定义类、属性、方法等最基本的功能。类可被认为是一种自定义的数据类...

  • 面向对象(一)

    Kotlin 支持面向对象编程,Kotlin 提供了定义类、属性、方法等最基本的功能。类可被认为是一种自定义的数据...

  • Java类和对象

    Java类和对象 类 面向对象和面向过程 面向对象:Object Oriented把系统中需要处理的数据和这些数据...

  • kotlin中的自定义访问器get() set()

    对于面向对象的封装 kotlin在编码过程中也不可避免但是kotlin在默认生成数据类data 的时候 并没有考虑...

  • pyqt5教程(二)一个简单的应用图标

    一、面向对象编程 PyQt5编程意味着就是面向对象的编程。在面向对象编程中有三个重要的东西,分别是类,数据和方法,...

  • 第六篇:Kotlin之面向对象简单

    上篇:Kotlin之函数Lambda表达式 下篇:Kotlin之面向对象升级(一) Kotlin也支持面向对象的三...

  • kot

    #Kotlin之班门弄斧 ##面向对象 ##java和kotlin的交互 ##协程及协程框架 ## 面向对象 ...

  • 第七篇:Kotlin之面向对象升级(一)

    上篇:Kotlin之面向对象简单 本章节来介绍Kotlin面向对象的高级部分: 一. 扩展:kotlin的扩展是一...

  • Kotlin面向对象之数据类(Data Classes)

    我们经常会创建一个除了持有数据,而没有其他用途的类。在这样一个类中,一些标准的函数(setter、getter等)...

网友评论

      本文标题:Kotlin面向对象 (5)✔️数据类

      本文链接:https://www.haomeiwen.com/subject/qzkutctx.html