《Kotlin核心编程》 ——3.4.2 用data class创建数据类
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。对于这两个方法,很多人比较陌生,接下来我们来详细介绍它们。
- 点赞
- 收藏
- 关注作者
评论(0)