《Kotlin核心编程》 ——3.4.2 用data class创建数据类

举报
华章计算机 发表于 2020/02/21 22:56:09 2020/02/21
【摘要】 本节书摘来自华章计算机《Kotlin核心编程》 —— 书中第3章,第3.4.2节,作者是水滴技术团队 。

3.4.2 用data class创建数据类

data class顾名思义就是数据类,当然这不是Kotlin的首创的概念,在很多其他语言中也有相应的设计,比如Scala中的case class。为了搞明白数据类是什么,我们先把上面那段Java代码用Kotlin的data class来表示:

data class Bird(var weight: Double, var age: Int, var color: String)

第一眼看到代码是不是难以置信,这么一行代码就能表示上面60多行的Java代码吗?是的,是不是突然感觉Kotlin简直太人性化了,这一切无非只是添加了一个data关键字而已。事实上,在这个关键字后面,Kotlin编译器帮我们做了很多事情。我们来看看这个类反编译后的Java代码:

public final class Bird {

    private double weight;

    private int age;

    @NotNull

    private String color;

 

    public final double getWeight() {

        return this.weight;

    }

 

    public final void setWeight(double var1) {

        this.weight = var1;

    }

 

    public final int getAge() {

        return this.age;

    }

 

    public final void setAge(int var1) {

        this.age = var1;

    }

 

    @NotNull

    public final String getColor() {

        return this.color;

    }

 

    public final void setColor(@NotNull String var1) {

        Intrinsics.checkParameterIsNotNull(var1, "<set-?>");

        this.color = var1;

    }

 

    public Bird(double weight, int age, @NotNull String color) {

        Intrinsics.checkParameterIsNotNull(color, "color");

        super();

        this.weight = weight;

        this.age = age;

        this.color = color;

    }

 

    public final double component1() { //Java中没有

        return this.weight;

    }

 

    public final int component2() { //Java中没有

        return this.age;

    }

 

    @NotNull

    public final String component3() { //Java中没有

        return this.color;

    }

 

    @NotNull

    public final Bird copy(double weight, int age, @NotNull String color) { //Java中没有

        Intrinsics.checkParameterIsNotNull(color, "color");

        return new Bird(weight, age, color);

    }

 

    // $FF: synthetic method

    // $FF: bridge method

    @NotNull

    public static Bird copy$default(Bird var0, double var1, int var3, String var4, int var5, Object var6) {

        if ((var5 & 1) != 0) {

            var1 = var0.weight;

        }

        if ((var5 & 2) != 0) {

            var3 = var0.age;

        }

        if ((var5 & 4) != 0) {

            var4 = var0.color;

        }

        return var0.copy(var1, var3, var4);

    }

 

    public String toString() {

        ...

    }

 

    public int hashCode() {

        ...

    }

 

    public boolean equals(Object var1) {

        ...

    }

}

这段代码是不是和JavaBean代码很相似,同样有getter/setter、equals、hashcode、构造函数等方法,其中的equals和hashcode使得一个数据类对象可以像普通类型的实例一样进行判等,我们甚至可以像基本数据类型一样用==来判断两个对象相等,如下:

val b1 = Bird(weight = 1000.0, age = 1, color = "blue")

val b2 = Bird(weight = 1000.0, age = 1, color = "blue")

>>> b1.equals(b2)

true

>>> b1 == b2

true

与此同时,我们还发现两个特别的方法:copy与componentN。对于这两个方法,很多人比较陌生,接下来我们来详细介绍它们。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。