Kotlin 核心编程 (64):面向对象 3.5.3

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

Kotlin核心编程(64):面向对象 3.5.3

(object 表达式)

内容简介
本书不是一本简单介绍 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 响应式框架和编程等内容。

写 Java 的时候很多人肯定被它的匿名内部类弄得很烦燥,有时候明明只有一个方法,却要用一个匿名内部类去实现。比如我们要对一个字符串列表排序:

复制代码
List<String> list = Arrays.asList("redpack", "score", "card");
Collections.sort(list, new Comparator<String>(){
@Override
public int compare(String s1, String s2){
if(s1 == null)
return -1;
if(s2 == null)
return 1;
return s1.compareTo(s2);
}
});

并不是说匿名内部类这个方式不好,只不过方法内掺杂类声明不仅让方法看起来复杂,也不易阅读理解。而在 Kotlin 中,可以利用object表达式对它进行改善:

复制代码
val comparator = object : Comparator<String> {
override fun compare(s1: String?, s2: String?): Int {
if (s1 == null)
return -1
else if (s2 == null)
return 1
return s1.compareTo(s2)
}
}
Collections.sort(list, comparator)

简单来看,object 表达式跟 Java 的匿名内部类很相似,但是我们发现,object 表达式可以赋值给一个变量,这在我们重复使用的时候将会减少很多代码。另外,我们说过 object 可以继承类和实现接口,匿名内部类只能继承一个类及实现一个接口,而 object 表达式却没有这个限制。

用于代替匿名内部类的 object 表达式在运行中不像我们在单例模式中说的那样,全局只存在一个对象,而是在每次运行时都会生成一个新的对象。

其实我们知道,匿名内部类与 object 表达式并不是对任何场景都适合的,Java 8 引入的 Lambda 表达式对有些场景实现起来更加适合,比如接口中只有单个方法的实现。而 Kotlin 天然就支持 Lambda 表达式,关于 Lambda 的相关知识可以回顾一下第 2 章中的内容。现在我们可以将上面的代码用 Lambda 表达式的方式重新改造一下:

复制代码
val comparator = Comparator<String> { s1, s2 ->
if (s1 == null)
return@Comparator -1 // 我们已经在第 2 章中接触过这种语法了
else if (s2 == null)
return@Comparator 1
s1.compareTo(s2)
}
Collections.sort(list, comparator)

使用 Lambda 表达式后代码变得简洁很多。

对象表达式与 Lambda 表达式哪个更适合代替匿名内部类?
当你的匿名内部类使用的类接口只需要实现一个方法时,使用 Lambda 表达式更适合;当匿名内部类内有多个方法实现的时候,使用 object 表达式更加合适。

Kotlin核心编程(64):面向对象 3.5.3

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

评论

发布