美文网首页Kotlin官方文档KotlinKotlin开发知识
Kotlin介绍系列(三)高级用法之DataClass

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

作者: Phoobobo | 来源:发表于2017-11-05 20:53 被阅读148次

    应用场景

    经常会需要创建一些类除了保存数据不干其他事情,比如我们解析网络请求下来的数据。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

    相关文章

      网友评论

      • 可乐核桃:印象中 属性委托 data 类中也会做一些;

      本文标题:Kotlin介绍系列(三)高级用法之DataClass

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