zoukankan      html  css  js  c++  java
  • Kotlin中data class

    data class算是Kotlin中一大闪光点了

    data class就是一个类中只包含一些数据字段,类似于vo,pojo,java bean。一般而言,我们在Java中定义了这个数据类之后要重写一下toString,equals等方法。要生成get,set方法。

    然而在Kotlin中这些都不在需要自己手动去敲了,编译器在背后默默给我们生成了如下的东西:

    • equals()/hashCode()
    • toString()方法
    • componentN()方法
    • copy()方法

    如何申明一个简单的数据类? 有一下几点要求:

    • 主构造函数必须要至少有一个参数
    • 主构造函数中的所有参数必须被标记为val或者var
    • 数据类不能有以下修饰符:abstract,inner,open,sealed
    • data class只能实现接口(Kotlin1.1以前的规则),现在也可以继承其它类
    data class User(var id: Int, var name: String)

    就这么一行代码,你已然拥有了一个数据类,就这么简单。来写几行代码测试一下相关的函数

    fun main(args: Array<String>) {
        var user: User = User(123,"liuliqianxiao")
        var user2: User = User(123,"liuliqianxiao")
        println(user.hashCode())
        println(user2.hashCode())
        println(user.equals(user2))// true
    
        println(user.toString())// User(id=123, name=liuliqianxiao)
    }

    主构造函数就是跟在类名后面的那个构造函数,必须至少要有一个参数,就代表了必须要有一个数据字段,hashCode,equals,toString都是要依据主构造函数来生成的

    主构造函数中的所有参数必须被标记为var或者val,var就表示可读写,val就表示只读,这就相当于表明了数据字段的访问权限,这就达到了Java中我们手动生成set get的目的

    编译器自动生成的toString函数格式如下:“类名(数据字段1=value1,数据字段2=value2,……)”

    一旦我们手动编写了上述方法(必须要加上override 关键字),则编译器不会自动生成对应的方法

    data class User(var id: Int,var name:String) {
    
        //手动重写toString方法
        override fun toString(): String{
            return "[User(id = $id,name = $name)]"
        }
    }

    再来看看自动生成的componentN()方法是干嘛用的

    在主构造函数中有多少个参数,就会依次生成对应的component1,component2,component3……这些函数返回的就是对应字段的值

    componentN函数是用来实现解构申明的

    data class User(var id: Int,var name:String) 

    fun main(args: Array
    <String>) { var user: User = User(123, "liuliqianxiao") var (id,name) = user//多重赋值 print("$id,$name") }

    拿上面的例子来说,给id赋值,其实调用的是user.component1(),给name赋值其实调用的是component2()函数。

    有了这个解构申明,想在一个函数中返回多个结果,就可以申明一个简单的数据类来返回了,然后取值也很方便。

    再来看看copy函数,默认生成的copy函数就是用现在的数据字段生成了一个新的对象。

    fun copy(id: Int = this.id,name: String = this.name) = User(id,name)

    如果只想改变其中的某些字段,就可以在调用copy的时候采用命名参数的方法进行调用

    fun main(args: Array<String>) {
        var user: User = User(123, "liuliqianxiao")
        var other: User = user.copy(name = "mdzz")//只想改变名字
    }

    data class很好用吧,对比java,不吹不黑,怎么说也能节省你一些时间的。

  • 相关阅读:
    python命令行工具模块-click
    python项目代码打包成Docker镜像
    背包九讲
    秒杀项目的3个奇数问题:并发队列的选择,请求接口的合理设计,高并发下的数据安全
    java类加载过程
    索引失效
    java面试
    进程间通信
    HashMap在Jdk1.7和1.8中的实现
    十大排序算法
  • 原文地址:https://www.cnblogs.com/liuliqianxiao/p/7152773.html
Copyright © 2011-2022 走看看