作者: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. C# 驱动的mongodb的分页查询简单示例

    /// <summary> /// mongodb分页查询 /// </summary> /// <typeparam name="T">< ...

  2. Jenkins添加项目说明,增加项目描述

    背景:往往正常Jenkins上呈现的内容,太过简短,不易直观看了解项目是干嘛的,如下面的内容: 解决方案,使用插件,Extra Columns Plugin 安装成功后配置,需要结合自定义视图使用,新 ...

  3. 前端js限制上传文件类型及大小(1)

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  4. firewalld 使用简介

    学习apache安装的时候需要打开80端口,由于centos 7版本以后默认使用firewalld后,网上关于iptables的设置方法已经不管用了,想着反正iptable也不会用,索性直接搬官方文档 ...

  5. Prim算法求最大权,POJ(2485)

    题目链接:http://poj.org/problem?id=2485 解题报告: 这里有一点要注意的是,第一个点时,dis数组还没有初始化,还全部为inf.第一次来到更新权时,才把邻接矩阵的数据存到 ...

  6. 模拟水题,牛吃草(POJ2459)

    题目链接:http://poj.org/problem?id=2459 题目大意:有C头牛,下面有C行,每头牛放进草地的时间,每天吃一个草,总共有F1个草,想要在第D的时候,草地只剩下F2个草. 解题 ...

  7. 2018.8.5 Bootstrap 使用

    Bootstrap的环境搭建 <link rel="stylesheet" type="text/css" href="css/bootstra ...

  8. apache单ip配置多端口多站点

    1.修改 /etc/httpd/conf/httpd.conf 添加一个Listen,如: Listen 80 Listen 8001 Listen 8002 2.添加一个VirtualHost #v ...

  9. 解决windows下Composer因php_openssl扩展缺失而安装失败的问题

    Composer( https://getcomposer.org/ )是PHP下的一个依赖管理工具.你可以在你的项目中声明你所需要用到的类库,然后Composer会在项目中为你安装它们.如果你了解N ...

  10. iOS App 瘦身方案

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...