Kotlin中的数据类

(今天疯狂忙碌的一天,这么简单的文章就满足了我的配额。对不起)

我之前提到过,与Java相比,Kotlin大大简化了。 实现此目标的最明显的地方之一就是您可能很快就会看到的地方,那就是数据类。

数据类只是类。 从那时起,他们没有什么特别的。 实际的“数据”关键字最初仅是编译器看到并作出反应的注释。 (老实说,我不确定这种情况是否仍然存在)。 这样,他们可以(几乎)做普通班可以做的任何事情。

数据类的重点是-信不信由你-他们是代表数据,而不是功能。 这是来自Java-land的Java Bean的定义。 而这正是它们的本质。 只有明显更多的流线型。 当您在类定义之前添加“ data”关键字(或注解,或其他名称)时,您要告诉编译器执行的操作是:

  • 产生一个班通过这组字段每个领域都有吸气剂(和可选的setter)带着等于和hashCode正确的方法用toString正确的方法用复制方法用set of 零件方法s

无论如何,前三个只是Kotlin定义类的一部分。 没什么特别的 真正将数据类引入其中的是其他四个。

写作等于,hashCode和toString methods isn't hard. 写作them 正确地 can be though. But even then,most of the time people either have their IDE generate them automatically or else they use something like Commons-Lang Equals/HashCode/ToStringBuilder classes. And that's fine,but not without cost. The generated ones from the IDE will get stale as soon as the class changes,unless you remember to keep them updated. The Builder classes will either suffer the same problems,or else will use reflection with the performance cost that incurs.

最后一组方法只是一些辅助方法。 的复制方法可让您获取一个对象,然后创建一个具有相同值的新对象。 或搭配一些相同的值。 您可以有选择地选择要替换为新值的值。 例如:

val user = User(username = "graham", email = "my.email@example.com", banned = false)
val copiedUser = user.copy(email = "my.real.email@example.com)

在这种情况下,copyedUser具有:

您只需要指定这些值之一即可。

的零件Destructuring使用的方法本身就是一个主题。 简而言之,它使您可以上课并将其分解为各个字段。 当您不关心类本身而是仅关注单个字段时,这在某些地方(例如模式匹配)非常有用。

简而言之,数据类没有什么特别的。 他们不是真的做任何东西。 它们只是让您不必为本质上生成的方法编写很多样板文件。 您可以编写具有许多字段的Java Bean,并在一行代码中获得所需的所有正确的JavaBean方法,并在顶部添加其他一些方法。 为了窃取Reddit的示例,它是这样的:

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String component1() {
        return name;
    }

    public int component2() {
        return age;
    }

    public User copy() {
        return new User(name, age);
    }

    public User copy(String newName) {
        return new User(newName, age);
    }

    public User copy(String newName, int newAge) {
        return new User(newName, newAge);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (age != user.age) return false;
        return name != null ? name.equals(user.name) : user.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

到这个:

data class User(val name: String, val age: Int)

from: https://dev.to//grahamcox82/data-classes-in-kotlin

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值