Kotlin的数据类:节省很多行代码(KAD 10)
作者:Antonio Leiva
时间:Jan 25, 2017
原文链接:https://antonioleiva.com/data-classes-kotlin/
在前面的文章中,我们已经见到了类,而数据类还可以进一步帮助我们简化代码。
数据类是什么?
数据类是仅仅包含状态而没有任何可执行的操作。
用数据类替换普通类的好处是Kotlin帮助我们产生大量的代码。
特别是,它使我们省去如下工作:
- 在构造函数中声明属性:这一技术不是数据类特有的,但是除了构造函数外,它避免了所有getter和setter模板。
- equals() / hashCode()
- 一组称之为comopinentX(),稍后我们能够了解到它们允许我们所做一些非常棒的事情。
- Copy()方法在我们使用不可变对象时非常有用。
Java代码与数据类如何比较
这里给出精彩的比较。尽管IDE能够产生几乎所有的代码,但是在Java中,我们需要这样实现数据类:
public class Person { private String name; private String surname; private String id; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (name != null ? !name.equals(person.name) : person.name != null) return false; if (surname != null ? !surname.equals(person.surname) : person.surname != null) return false; return id != null ? id.equals(person.id) : person.id == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (surname != null ? surname.hashCode() : 0); result = 31 * result + (id != null ? id.hashCode() : 0); return result; } @Override public String toString() { return "Person{" + "name='" + name + ''' + ", surname='" + surname + ''' + ", id='" + id + ''' + '}'; } }
并且,我们仍未实现与Kotlin这一行代码相同功能:
data class Person(var name: String, var surname: String, var id: String)
这里我们实实在在的看到Kotlin的潜力,为我们节省大量无用代码。
类重构
这是componentX的用法。感谢它们,你能够以这种方法解析数据类中变量:
val person = Person("x", "y", "z") val (n, s, i) = person
感谢这一切,你能够在循环内解析map键值对:
val map = mapOf(1 to "a", 2 to "b") for ((key, value) in map) { toast("key: $key, value: $value") }
对象复制
如我们前面所谈的,在每一个可能的不变性情况下,它是一个很好的实践。如果我们以不变实现前面类的:
data class Person(val name: String, val surname: String, val id: String)
现在要改变姓氏,就不能了。
当你以不可变方式运行,为了改变对象状态,你就需要复制它到新值。这就要用到copy函数:
val person = Person("John", "Smith", "123abc") val person2 = person.copy(surname="Rogers")
Copy函数可以尽可能多的得到你需要改变的参数值。如你所见,函数参数可以命名,这样你可以指定你要改变哪一个。
结论
数据类可以节省大量Java强制我们产生样板代码,这样最终代码更易于理解和便于维护。
如果你喜欢这篇文章,你可以得到我的免费指南,继续学习Kotlin,在指南中我展示了如何创建你的第一个Kotlin项目。
相关推荐
Lzs 2020-10-23
聚合室 2020-11-16
零 2020-09-18
Justhavefun 2020-10-22
jacktangj 2020-10-14
ChaITSimpleLove 2020-10-06
Andrea0 2020-09-18
周游列国之仕子 2020-09-15
afanti 2020-09-16
88234852 2020-09-15
YClimb 2020-09-15
风雨断肠人 2020-09-04
卖口粥湛蓝的天空 2020-09-15
stulen 2020-09-15
pythonxuexi 2020-09-06
abfdada 2020-08-26
梦的天空 2020-08-25