Kotlin 核心编程 (19):基础语法 2.2.1

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

Kotlin核心编程(19):基础语法 2.2.1

(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 响应式框架和编程等内容。

val 的含义虽然简单,但依然会有人迷惑。部分原因在于,不同语言跟 val 相关的语言特性存在差异,从而容易导致误解。

我们先用 val 声明一个指向数组的变量,然后尝试对其进行修改。

复制代码
>>> val x = intArrayOf(1, 2, 3)
>>> x = intArrayOf(2, 3, 4)
error: val cannot be reassigned
>>> x[0] = 2
>>> println(x[0])
2

因为引用不可变,所以 x 不能指向另一个数组,但我们可以修改 x 指向数组的值。

如果你熟悉 Swift,自然还会联想到 let,于是我们再把上面的代码翻译成 Swift 的版本。

复制代码
let x = [1, 2, 3]
x = [2, 3, 4]
Swift:: Error: cannot assign to value: 'x' is a 'let' constant
x[0] = 2
Swift:: Error: cannot assign through subscript: 'x' is a 'let' constant

这下连引用数组的值都不能修改了,这是为什么呢?

其实根本原因在于两种语言对数组采取了不同的设计。在 Swift 中,数组可以看成一个值类型,它与变量 x 的引用一样,存放在栈内存上,是不可变的。而 Kotlin 这种语言的设计思路,更多考虑数组这种大数据结构的拷贝成本,所以存储在堆内存中。

因此,val 声明的变量是只读变量,它的引用不可更改,但并不代表其引用对象也不可变。事实上,我们依然可以修改引用对象的可变成员。如果把数组换成一个 Book 类的对象,如下编写方式会变得更加直观:

复制代码
class Book(var name: String) { // 用 var 声明的参数 name 引用可被改变
fun printName() {
println(this.name)
}
}
fun main(args: Array<String>) {
val book = Book("Thinking in Java") // 用 val 声明的 book 对象的引用不可变
book.name = "Diving into Kotlin"
book.printName() // Diving into Kotlin
}

首先,这里展示了 Kotlin 中的类不同于 Java 的构造方法,我们会在第 3 章中介绍关于它具体的语法。其次,我们发现 var 和 val 还可以用来声明一个类的属性,这也是 Kotlin 中一种非常有个性且有用的语法,你还会在后续的数据类中再次接触到它的应用。

Kotlin核心编程(19):基础语法 2.2.1

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

评论

发布