Kotlin 核心编程 (20):基础语法 2.2.2

阅读数:3 2019 年 12 月 25 日 15:32

Kotlin核心编程(20):基础语法 2.2.2

(优先使用 val 来避免副作用)

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

在很多 Kotlin 的学习资料中,都会传递一个原则:优先使用 val 来声明变量。这相当正确,但更好的理解可以是:尽可能采用 val、不可变对象及纯函数来设计程序。关于纯函数的概念,其实就是没有副作用的函数,具备引用透明性,我们会在第 10 章专门探讨这些概念。由于后续的内容我们会经常使用副作用来描述程序的设计,所以我们先大概了解一下什么是副作用。

简单来说,副作用就是修改了某处的某些东西,比方说:

  • 修改了外部变量的值。
  • IO 操作,如写数据到磁盘。
  • UI 操作,如修改了一个按钮的可操作状态。

来看个实际的例子:我们先用 var 来声明一个变量 a,然后在 count 函数内部对其进行自增操作。

复制代码
var a = 1
fun count(x: Int) {
a = a + 1
println(x + a)
}
>>> count(1)
3
>>> count(1)
4

在以上代码中,我们会发现多次调用 count(1) 得到的结果并不相同,显然这是受到了外部变量 a 的影响,这个就是典型的副作用。如果我们把 var 换成 val,然后再执行类似的操作,编译就会报错。

复制代码
val a = 1
>>> a = a + 1
error: val cannot be ressigned

这就有效避免了之前的情况。当然,这并不意味着用 val 声明变量后就不能再对该变量进行赋值,事实上,Kotlin 也支持我们在一开始不定义 val 变量的取值,随后再进行赋值。然而,因为引用不可变,val 声明的变量只能被赋值一次,且在声明时不能省略变量类型,如下所示:

复制代码
fun main(args: Array<String>) {
val a: Int
a = 1
println(a) // 运行结果为 1
}

不难发现副作用的产生往往与可变数据共享状态有关,有时候它会使得结果变得难以预测。比如,我们在采用多线程处理高并发的场景,“并发访问”就是一个明显的例子。然而,在 Kotlin 编程中,我们推荐优先使用 val 来声明一个本身不可变的变量,这在大部分情况下更具有优势:

  • 这是一种防御性的编码思维模式,更加安全和可靠,因为变量的值永远不会在其他地方被修改(一些框架采用反射技术的情况除外);
  • 不可变的变量意味着更加容易推理,越是复杂的业务逻辑,它的优势就越大。

回到在 Java 中进行多线程开发的例子,由于 Java 的变量默认都是可变的,状态共享使得开发工作很容易出错,不可变性则可以在很大程度上避免这一点。当然,我们说过,val 只能确保变量引用的不可变,那如何保证引用对象的不可变性?你会在第 6 章关于只读集合的介绍中发现一种思路。

Kotlin核心编程(20):基础语法 2.2.2

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

评论

发布