• Kotlin的数据类:节省很多行代码(KAD 10)


    作者:Antonio Leiva

    时间:Jan 25, 2017

    原文链接:https://antonioleiva.com/data-classes-kotlin/

    在前面的文章中,我们已经见到了类,而数据类还可以进一步帮助我们简化代码。

    数据类是什么?

    数据类是仅仅包含状态而没有任何可执行的操作。

    用数据类替换普通类的好处是Kotlin帮助我们产生大量的代码。

    特别是,它使我们省去如下工作:

    • 在构造函数中声明属性:这一技术不是数据类特有的,但是除了构造函数外,它避免了所有getter和setter模板。
    • equals() / hashCode()
    • 一组称之为comopinentX(),稍后我们能够了解到它们允许我们所做一些非常棒的事情。
    • Copy()方法在我们使用不可变对象时非常有用。

    Java代码与数据类如何比较

    这里给出精彩的比较。尽管IDE能够产生几乎所有的代码,但是在Java中,我们需要这样实现数据类:

     1 public class Person {
     2  
     3     private String name;
     4     private String surname;
     5     private String id;
     6  
     7     public String getName() {
     8         return name;
     9     }
    10  
    11     public void setName(String name) {
    12         this.name = name;
    13     }
    14  
    15     public String getSurname() {
    16         return surname;
    17     }
    18  
    19     public void setSurname(String surname) {
    20         this.surname = surname;
    21     }
    22  
    23     public String getId() {
    24         return id;
    25     }
    26  
    27     public void setId(String id) {
    28         this.id = id;
    29     }
    30  
    31     @Override public boolean equals(Object o) {
    32         if (this == o) return true;
    33         if (o == null || getClass() != o.getClass()) return false;
    34  
    35         Person person = (Person) o;
    36  
    37         if (name != null ? !name.equals(person.name) : person.name != null) return false;
    38         if (surname != null ? !surname.equals(person.surname) : person.surname != null)
    39             return false;
    40         return id != null ? id.equals(person.id) : person.id == null;
    41  
    42     }
    43  
    44     @Override public int hashCode() {
    45         int result = name != null ? name.hashCode() : 0;
    46         result = 31 * result + (surname != null ? surname.hashCode() : 0);
    47         result = 31 * result + (id != null ? id.hashCode() : 0);
    48         return result;
    49     }
    50  
    51     @Override public String toString() {
    52         return "Person{" +
    53                 "name='" + name + ''' +
    54                 ", surname='" + surname + ''' +
    55                 ", id='" + id + ''' +
    56                 '}';
    57     }
    58 }

    并且,我们仍未实现与Kotlin这一行代码相同功能:

    1 data class Person(var name: String, var surname: String, var id: String)

    这里我们实实在在的看到Kotlin的潜力,为我们节省大量无用代码。

    类重构

    这是componentX的用法。感谢它们,你能够以这种方法解析数据类中变量:

    1 val person = Person("x", "y", "z")
    2 val (n, s, i) = person

    感谢这一切,你能够在循环内解析map键值对:

    1 val map = mapOf(1 to "a", 2 to "b")
    2  
    3 for ((key, value) in map) {
    4     toast("key: $key, value: $value")
    5 }

    对象复制

    如我们前面所谈的,在每一个可能的不变性情况下,它是一个很好的实践。如果我们以不变实现前面类的:

    1 data class Person(val name: String, val surname: String, val id: String)

    现在要改变姓氏,就不能了。

    当你以不可变方式运行,为了改变对象状态,你就需要复制它到新值。这就要用到copy函数:

    1 val person = Person("John", "Smith", "123abc")
    2 val person2 = person.copy(surname="Rogers")

    Copy函数可以尽可能多的得到你需要改变的参数值。如你所见,函数参数可以命名,这样你可以指定你要改变哪一个。

    结论

    数据类可以节省大量Java强制我们产生样板代码,这样最终代码更易于理解和便于维护。

    如果你喜欢这篇文章,你可以得到我的免费指南,继续学习Kotlin,在指南中我展示了如何创建你的第一个Kotlin项目。

  • 相关阅读:
    2020年7月3日 查找算法 代码
    QList 和QStringList为空 at()的错误
    网络编程TCP
    02#2位带操作
    04#认识指针
    03#指针内存图//拓展大小端序
    02#循环控制+分支控制+goto标签//拓展3目运算符和逗号运算符
    01#c语言基础内容
    输入的竖线变横
    Keil打包工程
  • 原文地址:https://www.cnblogs.com/figozhg/p/6363335.html
Copyright © 2020-2023  润新知