写点什么

Kotlin 核心编程:Kotlin,改良的 Java

  • 2020-04-22
  • 本文字数:3068 字

    阅读完需:约 10 分钟

Kotlin核心编程:Kotlin,改良的 Java

编者按:本文节选自华章科技出版的 《Kotlin 核心编程》一书中的部分章节。


2010 年,JetBrains 产生创造 Kotlin 的想法。关于大名鼎鼎的 JetBrains,想必在业内是人尽皆知,知名的 IntelliJ IDEA 就是他们的产品之一。拥有为各种语言构建开发工具经验的 JetBrains,自然是对编程语言设计领域最熟悉的一群人。当时,一方面他们看到了 C#在.NET 平台上大放异彩;另一方面,Java 相比新语言在某种程度上的滞后,让他们意识到改良 Java 这门主流语言的必要性。


JetBrains 团队设计 Kotlin 所要面临的第一个问题,就是必须兼容他们所拥有的数百万行 Java 代码库,这也代表了 Kotlin 基于整个 Java 社区所承载的使命之一,即需要与现有的 Java 代码完全兼容。这个背景也决定了 Kotlin 的核心目标——为 Java 程序员提供一门更好的编程语言。

Kotlin 的实用主义

Kotlin 常常被认为是一门近似于 Scala 的语言。的确,它们的诞生都源于对 Java 语言的改良,同时都在面向对象和函数式之间建立起了多范式的桥梁。不可否认的是,Kotlin 确实从 Scala 身上借鉴了许多,就连它的创作团队也表示过:“如果你用 Scala 感到很开心,那么你并不需要 Kotlin。”


然而,Kotlin 与 Scala 的设计哲学又十分不同。Kotlin 并没有像 Scala 那样热衷于编程语言本身的研究和探索。相反,它在解放 Java 的同时,又在语言特性的选择上表现得相当克制。


我们说过,Scala 旨在成为一门程序员梦想中的语言,它包含了所有你想拥有的语言特性。而 Kotlin 更加立足现实,它现阶段仍没有宏,也拒绝了很多所谓的高级函数式语言特性。但它在 Java 的基础上发展出很多改善生产力的语言特性,如数据类、when 表达式(一定程度上的模式匹配)、扩展函数(和属性)、可空类型等,而且它似乎偏好语法糖,比如 Smart Casts,因为这可以让编程人员的工程开发变得更加容易。


可以看出,Kotlin 的自我定位非常清晰,它的目标就是在计算机应用领域成为一门实用且高效的编程语言。如果说 Scala 的设计理念是 more than Java(不仅仅是 Java),那么 Kotlin 才是一门真正意义上的 better Java(更好的 Java)。

更好的 Java

如果你用 Kotlin 开发过业务,很快就会意识到它相较于 Java 的语法更加简洁、高效。比如 Kotlin 做了这些改良:


  • 在很大程度上实现了类型推导,而 Java 在 SE 10 才支持了局部变量的推导。

  • 放弃了 static 关键字,但又引入了 object,可以直接用它来声明一个单例。而作为比较,Java 则必须依靠构建所谓的“单例模式”才能等效表达。

  • 引入了一些在 Java 中没有的“特殊类”,比如 Data Classes(数据类)、Sealed Classes(密封类),我们可以构建更深程度上的代数数据类型,结合 when 表达式来使用。


但可能你会问,以上 Kotlin 的特性,Scala 也有,能否可以说前者只是后者的一个子集呢?这种表述其实是不恰当的。其实,Kotlin 在致力于成为更好的 Java 的道路上,不仅仅依靠这些新增的语言特性,它在兼容 Java 方面做了大量的工作,比 Scala 走得更远。


首先,从语言命名上就可以看出 Kotlin 在严格遵循 Java 的传统,它们都采用了岛屿的名字。


Java 的名字来源于印度尼西亚瓜哇岛的英文名称,而 Kotlin 是俄罗斯圣彼得堡附近的一个岛屿的名字。


其次,虽然都是兼容 Java,Scala(最近的几个版本)必须要求 Java 8,而 Kotlin 则可以与 Java 6 一起工作,这也是后者在 Android 上更加流行的原因之一。


另外,Kotlin 并没有像 Scala 那样在语法的探索上表现得“随心所欲”,Java 程序员在学习 Kotlin 新语法特性的同时,依旧可以保留更多原有的习惯。举个例子,在 Scala 中,一切皆有类型。所以在大部分时间里,我们都用等号来定义一个 Scala 的函数。函数体最后一个表达式的值就是这个函数的返回类型。


def foo(x: Int) = {    val y = x + 2    x + y}
复制代码


没错,Scala 舍弃了 return 关键字。在 Kotlin 中,它也引入了使用单行表达式来定义函数的语法,不需要用 return 来返回结果值。


fun foo(x: Int) = x * 2 + 2
复制代码


然而,大部分情况下,我们还是可以采用类似 Java 的方式来定义一个函数,如:


fun foo(x: Int): Int {    val y = x * 2    return y + 2}
复制代码


由于 Kotlin 比 Scala 更加兼容 Java 的生态和语法,Java 程序员可以更加容易地掌握它。同时,Kotlin 非常注重语法的简洁表达。如果你了解 Scala 中的 implicit,可能曾被这个 Scala 的语法惊吓到,因为它非常强大。然而,正如我们提到的,“简单灵活”的另一面意味着抽象和晦涩。Kotlin 注重的是工程的实用性,所以它创造了扩展的语法,虽然相比 implicit 在功能上有损失,但显得更加具体直观,且依旧非常强大,可满足日常开发中绝大多数的需求。值得一提的是,Android 则依靠这个 Java 所没有的特性,推出了扩展库 android-ktx,我们在第 7 章将专门介绍这种强大的特性。


此外,Kotlin 还新增了一些 Java、Scala 中没有的语法糖。如果你从事 Android 开发,那么肯定少不了在工程中写过如下的 Java 代码:


if(parentView instanceof ViewGroup){    ((ViewGroup) parentView).addView(childView);}
复制代码


为了类型安全,我们不得不写两遍 ViewGroup。然而在 Kotlin 中我们却可以直接这么写:


if(parentView is ViewGroup){    parentView.addView(childView)}
复制代码


这依靠的是 Kotlin 中的 Smart Casts 特性。我们不评价这种语法糖是好是坏,但它可以在一定程度上改善我们在工程开发中的体验。


总体而言,Kotlin 旨在成为一门提升 Java 生产力的更好的编程语言,它拥有简洁的表达能力、强大的工具支持,同时至今仍然保持着非常快速的编译能力。相较而言,用 Scala 开发则常常受到编译过慢带来的困扰。

强大的生态

现在,我们已经了解了 Kotlin 整体的设计哲学,以及它相较 Java、Scala 的魅力所在。当然,本章似乎并没有涉及任何语法细节,我们会在后续的内容中深入介绍 Kotlin 的语言特性,并且探索它具体的高级应用。


关于 Kotlin,还有一个问题需要解答:我们究竟可以用它来做什么?大概率上你是因为 Kotlin 成为 Android 官方支持语言的新闻而知晓它的。事实上,Kotlin 不仅支持 Android,它还是一门通用语言,如果用一句话来总结,那就是“Targeting JVM / JavaScript and Native”。现阶段,我们至少可以用 Kotlin 做以下的事情。


(1)Android 开发


我们不仅可以用 Kotlin 调用现成的 Java 库,而且还有 Google 提供的 Kotlin 扩展库。Kotlin 的语法非常适合 Android 工程开发,例如我们提到过的 Smart Casts。用它还可以改善 findViewById 的语法调用。


(2)服务端开发


这是 JVM 语言最大的一个应用领域,自然也是 Kotlin 发挥的舞台。在 Android 支持 Kotlin 之后,Spring Framework 5 也对它敞开了怀抱。基于 Kotlin 更自然的函数式特性,用 Spring 进行 Web 开发会在某些方面拥有比 Java 更好的开发体验。


(3)前端开发


Kotlin 还有两个强大的特性:dynamic 类型及类型安全的构建器。前者实现其与 JavaScript 互通,后者可以帮助开发者构建可靠的 HTML 页面。你可以尝试使用 Kotlin 来构建 UI。


(4)原生环境开发


因为 Kotlin Native 这个项目,Kotlin 终于告别了 Java,离开了 JVM,直接编译成机器码供系统环境运行。虽然 Kotlin Native 尚处于早期阶段,但后续的发展非常值得期待。如果你家里有一个树莓派,不妨可以用它来试一试。


如你所见,Kotlin 还是一门非常开放、具有强大生态的编程语言。如果说与 Java 兼容能让它运行在所有支持 Java 的地方,那么它的革命创新使得它超越了 Java,进入了更加广阔的世界。


图书简介https://item.jd.com/12519581.html?dist=jd



相关阅读


Scala复合但不复杂,简单却不容易


2020-04-22 10:042378

评论

发布
暂无评论
发现更多内容

区块链技术在智慧城市领域有五大应用价值

CECBC

区块链

介绍一个新库: Norns.Urd.HttpClient

八苦-瞿昙

C# HTTP aop

架构训练营大作业

Geek_ce484f

架构师训练营第 1 期

架构师训练营 大作业1

FG佳

架构师 01 期,大作业二

子文

公司上市失败,投资方险被CEO和CTO坑 | 法庭上的CTO(27)

赵新龙

CTO 法庭上的CTO

简历造假的CEO和工作不满60天的CTO| 法庭上的CTO(28)

赵新龙

CTO 法庭上的CTO

架构师训练营 4 期 第一周

引花眠

架构师训练营 4 期

架构训练营大作业2

Geek_ce484f

架构师训练营第 1 期

week10-根据当周学习情况,完成一篇学习总结

未来已来

架构训练营第十三周作业

Geek_ce484f

架构师训练营第 1 期

侵犯老东家“专利权”的技术总监 | 法庭上的CTO(26)

赵新龙

CTO 法庭上的CTO

SSM框架进阶笔记,阿里达摩院分享必是精品

Java架构师迁哥

week11-作业一

未来已来

Week11作业

lggl

week10-

未来已来

第六周作业

Binary

week11-作业二根据当周学习情况,完成一篇学习总结

未来已来

架构师训练营第一期大作业

Leo乐

架构师训练营第 1 期

架构2期 - 第十一周作业(1)

浮生一梦

2组 第十一周作业

导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。

落朽

架构师训练营大作业 (二)

orchid9

人工智能开始改变生活方式,区块链在人工智能时代的作用

CECBC

区块链

论区块链技术与数字货币的发展

CECBC

数字货币 区块链技术

Python进阶之Monad

正向成长

Python Monad

架构师训练营大作业 (一)

orchid9

架构师训练营第一期思维导图

Leo乐

架构师训练营第 1 期

架构师训练营大作业二

FG佳

Java并发编程实战(1)- 并发程序的bug源头

技术修行者

Java 多线程 并发

再见,2020

Rayjun

年终总结

从田间到餐桌,5G、IoT、AI如何催生智慧农业?

脑极体

Kotlin核心编程:Kotlin,改良的 Java_移动_水滴技术团队_InfoQ精选文章