作者: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. QT OpenGL中文教程在QT4版本后的错误代码更改(一)

    由于教程中说的已经够可以了,这里就不对代码进行分析了,有兴趣可以自己去看看.这个教程来源于原来的NeHeOpenGL中文教程 (http://www.yakergong.net/nehe/) ,但其有 ...

  2. Poj(2312),坦克大战,BFS的变形

    题目链接:http://poj.org/problem?id=2312 挺有趣的一道题目,然而很容易WA,我就WA了一次,虽然我Debug的时候已经知道哪里出问题了,就是比如说我搜到B和E时,从B搜第 ...

  3. linux命令之sed命令

    sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令 ...

  4. 前端面试题(来自前端网http://www.qdfuns.com/notes/23515/c9163ddd620baac5dd23141d41982bb8.html)

    HTML&CSS 1. 常用那几种浏览器测试?有哪些内核(Layout Engine)? (Q1)浏览器:IE,Chrome,FireFox,Safari,Opera. (Q2)内核:Trid ...

  5. js图片库 案例

    事件处理函数:事件处理函数的作用是,在特定事件发生时调用特定的JavaScript代码.本例中想要在用户点击某个链接的时候触发一个动作,所以需要使用onclick事件处理函数. 添加事件处理函数的语法 ...

  6. jquery 表单事件

    .blur() 当元素失去焦点的时候触发事件. .blur(handler(eventObject)) handler(eventObject) 每当事件触发时候执行的函数. .blur([event ...

  7. js将人民币数字转大写

    function numberToUpper(money) { var cnNums = new Array("零", "壹", "贰", ...

  8. tp5 使用技巧(持续更新中...)

    tp5 使用技巧(持续更新中...) 1.自动写入时间 create_time和update_time 使用save方法才行,insert方法不生效,不知为何 2.过滤字段 allowfield和st ...

  9. PHP 7.1版本 微信安全模式消息接受

    token 验证就不多讲了 重点说一下PHP7.1版本的加密解密算法 php7.1发布后新特性吸引了不少PHPer,大家都在讨论新特性带来的好处与便利. 但是从php7.0 升级到 php7.1 废弃 ...

  10. .c和.h区别

    本质没有区别: .h是头文件 一般情况下下边内容放在.h文件中 宏定义 结构体,联合,枚举声明 typedef声明 外部函数声明 全局变量声明 .c是程序文件 一般情况下下边内容放在.h文件中 内含函 ...