Kotlin介绍系列(三)高级用法之DataClass

应用场景

经常会需要创建一些类除了保存数据不干其他事情,比如我们解析网络请求下来的数据。Kotlin就提供了一个非常方便的class—— data class

长什么样儿?

data class User(val name: String, val age: Int)

我们知道在Kotlin中,声明类的同时可以方便的直接声明构造方法等参数,鉴于data class只是存放数据,那么只一个构造方法足矣,所以连类的body也就不需要了。是不是很清爽?

data class为我们做了什么

编译器会根据我们在构造函数里声明的属性自动导出下列成员:

  • equals() /hashCode()对儿
  • toString() // e.g.: "User(name=Jone, age=12)"
  • componentN()
  • copy()
    如果在类里面明确定义或者继承了上面的基础方法,则不会再自动生成

规则

  • 基础构造函数需要至少有一个参数
  • 所有基础构造函数的参数都必须用val或者var标记
  • data class不可以是abstract, open, sealed or inner
  • 不可以实现接口
  • 因为对于JVM,一个类要有无参构造函数,那么这个类的所有属性都必须指定好,比如
    data class User(val name: String = "", val age: Int = 0)

拷贝

经常会遇到我们只需要替换一个对象的个别属性,而其他属性保留的情况。这就是data class中生成的copy函数的作用了。
本文已开始的例子类,它的生成的默认copy函数是下面这样的:
fun copy(name: String = this.name, age: Int = this.age) = User(name, age)
这就运训我们这样写:

val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)

data class的结构化声明

data class的生成的component方法给我们的结构化声明及使用提供了可能

val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age") // prints "Jane, 35 years of age"

Kotlin介绍系列(三)高级用法之object
Kotlin介绍系列(三)高级用法之Delegation

    原文作者:Phoobobo
    原文地址: https://www.jianshu.com/p/2ab3e4f1a8c5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞