《Kotlin核心编程》 ——3.4 真正的数据类
3.4 真正的数据类
通过前面的内容我们发现,Kotlin在解决多继承问题上非常灵活。但是有时候,我们并不想要那么强大的类,也许我们只是想要单纯地使用类来封装数据,类似于Java中的DTO(Data Transfer Object)的概念。但我们知道在Java中显得烦琐,因为通常情况下我们会声明一个JavaBean,然后定义一堆getter和setter。虽然IDE能帮我们自动生成这些代码,但是你很可能已经厌烦了这些冗长的代码了。下面就来看看Kotlin是如何改进这个问题的吧。
3.4.1 烦琐的JavaBean
首先我们先来回顾一下熟悉的JavaBean。当我们要定义一个数据模型类时,就需要为其中的每一个属性定义getter、setter方法。如果要支持对象值的比较,我们甚至还要重写hashcode、equals等方法。比如下面的例子:
public class Bird {
private double weight;
private int age;
private String color;
public void fly() {
}
public Bird(double weight, int age, String color) {
this.weight = weight;
this.age = age;
this.color = color;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof Bird))
return false;
Bird bird = (Bird) o;
if (Double.compare(bird.getWeight(), getWeight()) != 0)
return false;
if (getAge() != bird.getAge())
return false;
return getColor().equals(bird.getColor());
}
@Override
public int hashCode() {
int result;
long temp;
temp = Double.doubleToLongBits(getWeight());
result = (int) (temp ^ (temp > > > 32));
result = 31 * result + getAge();
result = 31 * result + getColor().hashCode();
return result;
}
@Override
public String toString() {
return "Bird{" +
"weight=" + weight +
", age=" + age +
", color='" + color + '\'' +
'}';
}
}
这是一个只有3个属性的JavaBean,但代码量竟然足有60多行。可想而知,若是你想要更多的属性,那么一个JavaBean将会有多少代码量,而你的初衷无非就是想要有一个单纯封装数据的类而已,最后却变成了一堆样板式的代码。幸运的是,在Kotlin中我们将不再面对这个问题,它引入了data class的语法来改善这一情况。让我们来看看它到底是一个什么东西。
- 点赞
- 收藏
- 关注作者
评论(0)