Kotlin 核心编程 (58):面向对象 3.4.2

阅读数:2 2019 年 12 月 28 日 22:25

Kotlin核心编程(58):面向对象 3.4.2

(用 data class 创建数据类)

内容简介
本书不是一本简单介绍 Kotlin 语法应用的图书,而是一部专注于帮助读者深入理解 Kotlin 的设计理念,指导读者实现 Kotlin 高层次开发的实战型著作。书中深入介绍了 Kotlin 的核心语言特性、设计模式、函数式编程、异步开发等内容,并以 Android 和 Web 两个平台为背景,演示了 Kotlin 的实战应用。
全书共 13 章,分为 4 个部分:
热身篇—Kotlin 基础(第 1~2 章),简单介绍了 Kotlin 设计哲学、生态及基础语法,其中包括 Kotlin 与 Scala、Java 之间的关联与对比,以及 Kotlin 的类型声明的特殊性、val 和 var 的使用、高阶函数的使用、面向表达式编程的使用、字符串的定义与操作等内容;
下水篇—Kotlin 核心(第 3~8 章),深入介绍了面向对象、代数数据类型、模式匹配、类型系统、Lambda、集合、多态、扩展、元编程等 Kotlin 开发核心知识,这是本书的重点,其中涉及很多开发者特别关心的问题,比如多继承问题、模式匹配问题、用代数数据类型抽象业务问题、泛型问题、反射问题等。
潜入篇—Kotlin 探索(第 9~11 章),探索 Kotlin 在设计模式、函数式编程、异步和并发等编程领域的应用,其中包括对 4 大类设计模式、Typeclass 实现、函数式通用结构设计、类型替代异常处理、共享资源控制、CQRS 架构等重点内容的深入剖析;
遨游篇—Kotlin 实战(第 12~13 章),着重演示了 Kotlin 在 Android 和 Web 平台的实战案例,其中涉及架构方式、单向数据流模型、解耦视图导航、响应式编程、Spring 5 响应式框架和编程等内容。

data class顾名思义就是数据类,当然这不是 Kotlin 的首创的概念,在很多其他语言中也有相应的设计,比如 Scala 中的 case class。为了搞明白数据类是什么,我们先把上面那段 Java 代码用 Kotlin 的 data class 来表示:

复制代码
data class Bird(var weight: Double, var age: Int, var color: String)

第一眼看到代码是不是难以置信,这么一行代码就能表示上面 60 多行的 Java 代码吗?是的,是不是突然感觉 Kotlin 简直太人性化了,这一切无非只是添加了一个 data 关键字而已。事实上,在这个关键字后面,Kotlin 编译器帮我们做了很多事情。我们来看看这个类反编译后的 Java 代码:

复制代码
public final class Bird {
private double weight;
private int age;
@NotNull
private String color;
public final double getWeight() {
return this.weight;
}
public final void setWeight(double var1) {
this.weight = var1;
}
public final int getAge() {
return this.age;
}
public final void setAge(int var1) {
this.age = var1;
}
@NotNull
public final String getColor() {
return this.color;
}
public final void setColor(@NotNull String var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.color = var1;
}
public Bird(double weight, int age, @NotNull String color) {
Intrinsics.checkParameterIsNotNull(color, "color");
super();
this.weight = weight;
this.age = age;
this.color = color;
}
public final double component1() { //Java 中没有
return this.weight;
}
public final int component2() { //Java 中没有
return this.age;
}
@NotNull
public final String component3() { //Java 中没有
return this.color;
}
@NotNull
public final Bird copy(double weight, int age, @NotNull String color) { //Java 中没有
Intrinsics.checkParameterIsNotNull(color, "color");
return new Bird(weight, age, color);
}
// $FF: synthetic method
// $FF: bridge method
@NotNull
public static Bird copy$default(Bird var0, double var1, int var3, String var4, int var5, Object var6) {
if ((var5 & 1) != 0) {
var1 = var0.weight;
}
if ((var5 & 2) != 0) {
var3 = var0.age;
}
if ((var5 & 4) != 0) {
var4 = var0.color;
}
return var0.copy(var1, var3, var4);
}
public String toString() {
...
}
public int hashCode() {
...
}
public boolean equals(Object var1) {
...
}
}

这段代码是不是和 JavaBean 代码很相似,同样有 getter/setter、equals、hashcode、构造函数等方法,其中的 equals 和 hashcode 使得一个数据类对象可以像普通类型的实例一样进行判等,我们甚至可以像基本数据类型一样用 == 来判断两个对象相等,如下:

复制代码
val b1 = Bird(weight = 1000.0, age = 1, color = "blue")
val b2 = Bird(weight = 1000.0, age = 1, color = "blue")
>>> b1.equals(b2)
true
>>> b1 == b2
true

与此同时,我们还发现两个特别的方法:copycomponentN。对于这两个方法,很多人比较陌生,接下来我们来详细介绍它们。

Kotlin核心编程(58):面向对象 3.4.2

购书地址 https://item.jd.com/12519581.html?dist=jd

评论

发布