作者: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项目。

Kotlin的数据类:节省很多行代码(KAD 10)的更多相关文章

  1. FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!

    一切为客户着想 一切的一切还得从和一位台湾客户的沟通说起: 客户提到将ViewState保存在服务器端以减少上行数据量,从而加快页面的回发速度. 但是在FineUI中,控件状态都保存在FState中, ...

  2. 天底下最简单的QT画图板,就一个类,60行代码

    简单直观.但是我有个问题是,这实际上不是在绘制直线,而是几千几万个超级短的“直线”,这样会不会效率很低呢? 注意,每次绘制的时候,需要一支笔,这支笔需要设置颜色和宽度(就像我们平时写字也要稍微挑一下笔 ...

  3. 利用input-radio和input-checkbox的表单特性可以节省很多js代码

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. Kotlin——最详细的数据类、密封类详解

    在前面几个章节章节中,详细的讲解了Koltin中的接口类(Interface).枚举类(Enmu),还不甚了解的可以查看我的上一篇文章Kotlin--接口类.枚举类详解.当然,在Koltin中,除了接 ...

  5. 用kotlin方式打开《第一行代码:Android》

    参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android> 注2:本文不赘述android开发的基本理论,不介绍 ...

  6. 用kotlin方式打开《第一行代码:Android》之开发酷欧天气(1)

    参考:<第一行代码:Android>第2版--郭霖 注1:本文为原创,例子可参考郭前辈著作:<第一行代码:Android>第2版 注2:本文不赘述android开发的基本理论, ...

  7. Kotlin实现《第一行代码》案例“酷欧天气”

    看过<第一行代码>的朋友应该知道“酷欧天气”,作者郭神用整整一章的内容来讲述其从无到有的过程. 最近正好看完该书的第二版(也有人称“第二行代码”),尝试着将项目中的Java代码用Kotli ...

  8. python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据

    python量化分析系列之---5行代码实现1秒内获取一次所有股票的实时分笔数据 最近工作太忙了,有一个星期没有更新文章了,本来这一期打算分享一些对龙虎榜数据的分析结果的,现在还没有把数据内的价值很好 ...

  9. Kotlin 数据类与密封类

    数据类 Kotlin 可以创建一个只包含数据的类,关键字为 data: data class User(val name: String, val age: Int) 编译器会自动的从主构造函数中根据 ...

随机推荐

  1. IOS 解析XML数据

    ●  什么是XML ●  全称是Extensible Markup Language,译作“可扩展标记语言” ●  跟JSON一样,也是常用的一种用于交互的数据格式 ●  一般也叫XML文档(XML ...

  2. ACM Arabella Collegiate Programming Contest 2015 F. Palindrome 并查集

    题目链接:http://codeforces.com/gym/100676/attachments 题意: 给一个字符串,有一些约束条件,两个位置要相同,有一些是问号,求最后有多少种方案回文? 分析: ...

  3. spring依赖注入(转)

    转自:https://blog.csdn.net/taijianyu/article/details/2338311/ Spring 能有效地组织J2EE应用各层的对象.不管是控 制层的Action对 ...

  4. C语言中%p,%u,%lu都有什么用处

    %p表示输出这个指针, %d表示后面的输出类型为有符号的10进制整形, %u表示无符号10进制整型, %lu表示输出无符号长整型整数 (long unsigned)

  5. 用js给元素加css

    1.如果是没有CSS文件,或者要修改的不在CSS文件里,那么: document.getElementById('DIV标签的ID').style.属性='属性值'; 这样就可以了.2.如果,样式是写 ...

  6. C#中类的声明

    一.C#中类的声明 在C#中必须先声明类,然后才能在程序中使用. 类的声明格式如下: [类的属性] [访问修饰符] class 类名称 [: 父类名]{    [成员修饰符] 类的成员变量或者成员函数 ...

  7. django中间件及中间件实现的登录验证

    1.定义 一个用来处理Django的请求和响应的框架级别的钩子(函数),相对比较轻量级,并且在全局上改变django的输入与输出(使用需谨慎,否则影响性能) 直白的说中间件就是帮助我们在视图函数执行之 ...

  8. 11、SpringBoot------定时任务

      开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/Springboot/tree/52ef6c0c805913db1e66ed18671c322e ...

  9. jquery操作DOM 元素(3)

    .detach() 从DOM 中去掉所匹配的元素. .detach([selector]) selector 一个选择表达式将需要移除的从匹配的元素中过滤出来. $("p").de ...

  10. HJ浇花

    题目描述 HJ养了很多花(99999999999999999999999999999999999盆),并且喜欢把它们排成一排,编号0~999999999999999999999999999999999 ...