返回 登录
2

进行 Kotlin 实战开发前,你应了解的那些技术点

本文概览:

  • Kotlin 的基本示范
  • Kotlin 语言的主要特征
  • Android 和服务器端开发的可能性
  • Kotlin 与其他语言的区别
  • 用 Kotlin 编写并运行代码

Kotlin 到底是什么 ? 它是一种针对 Java 平台的新编程语言。Kotlin 简洁、安全、务实,并且专注于与 Java 代码的互操作性。它几乎可以用在现在 Java 使用的任何地方 :服务器端开发、Android 应用,等等。Kotlin 可以很好地和所有现存的 Java 库和框架一起工作,而且性能水平和 Java 旗鼓相当。本文我们将详细地探讨 Kotlin 的主要特征。

Kotlin初体验

让我们从一个小例子开始,来看看 Kotlin 代码长什么样子。这个例子定义了一个 Person 类来表示“人”,创建一个“人”的集合,查找其中年纪最大的人,并打印结果。尽管这是非常小的一段代码,从中也可以看到 Kotlin 许多有趣的特性。

我们对其中的一些特性做了标记,以便你可以方便地在本书后续的内容中找到它们。

代码简要地进行了解释,但是如果有些内容你现在还无法理解,请不要担心,稍后我们会详细讨论。

如果你想尝试运行这个例 子,最简单的方法是使用 http://try.kotl.in 的在线 Playground。输入示例代码并单击 Run 按钮,代码将会执行。

代码清单 1.1 Kotlin 初体验

你声明了一个简单的数据类,它包括了两个属性:name和age。age属性默认为null(如果没有指定)。在创建“人”的列表时,你省略了Alice的年龄,所以这里年龄使用了默认值null。然后你调用了maxBy函数来查找列表中年纪最大的那个“人”。传递给这个函数的lambda表达式需要一个参数,使用it作为这个参数的默认名称。如果age属性为null,Elvis运算符(?:)会返回零。因为Alice的年龄没有指定,Elvis运算符使用零代替了它,所以Bob幸运地成了年纪最大的人。

喜欢这样的代码吗 ? 继续读下去,你将会学习到更多,并成为一名 Kotlin 专家。我们希望不久之后,在你自己的项目中也能看到这样的代码,而不只是在书上。

Kotlin的主要特征

你大概已经知道了 Kotlin 是一种怎样的语言,让我们更加深入地了解一下它的关键属性。首先,我们来看看你能用 Kotlin 创造哪些种类的应用程序。

目标平台 :服务器端、Android 及任何 Java 运行的地方

Kotlin 的首要目标是提供一种更简洁、更高效、更安全的替代 Java 的语言,并且适用于现今使用 Java 的所有环境。Java 是一门非常受欢迎的语言,它广泛地应用于不同的环境 :小到智能卡 (JavaCard 技术 ),大到 Google、Twitter、LinkedIn 和其他这种规模的互联网公司运行的最大的数据中心。在这些地方,使用 Kotlin 可以帮助开发者在实现目标的同时减少代码并避免麻烦。

Kotlin 最常见的应用场景有 :

  • 编写服务器端代码(典型的代表是 Web 应用后端)
  • 创建 Android 设备上运行的移动应用

但 Kotlin 还有其他用武之地。例如,可以使用 Intel Multi-OS Engine((https:// software.intel.com/en-us/multi-os-engine)让 Kotlin 代码运行在 iOS 设备上。还可以 使用 Kotlin 和 TornadoFX(https://github.com/edvin/tornadofx)以及 JavaFX(http://mng.bz/500y) 一起来构 建桌面应用程序。

除了 Java 之外,Kotlin 还可以编译成 JavaScript,允许你在浏览器中运行 Kotlin 代码。但截止本书撰写时,对 JavaScript 的支持仍在 JetBrains 内部探索并进行原型 开发,这超出了本书的范围,而其他一些平台也在考虑支持 Kotlin 的未来版本。

正如你所看到的,Kotlin 的目标平台是相当广泛的。Kotlin 并没有被限制在单 一的问题域,也没有被限制在解决软件开发者面临的某一类型的挑战。相反,对所 有开发过程中涌现的任务,Kotlin 都提供了全面的生产力提升。它借助支持特定领 域或编程范式的库,提供了卓越的集成水准。接下来让我们来看看 Kotlin 作为一种 编程语言的关键特质。

静态类型

Kotlin 和 Java 一样是一种静态类型的编程语言。这意味着所有表达式的类型在 编译期已经确定了,而编译器就能验证对象是否包含了你想访问的方法或者字段。

这与 动态类型 的编程语言形成了鲜明的对 比,后者在 JVM 上的代表包括 Groovy 和 JRuby。这些语言允许你定义可以存储任何数据类型的变量,或者返回任 何数据类型的函数,并在运行时才解析方法和字段引用。这会减少代码量并增加创 建数据结构的灵活性。但它的缺点是,在编译期不能发现像名字拼写错误这样的问题,继而导致运行时的错误。

另一方面,与 Java 不同的是,Kotlin 不需要你在源代码中显式地声明每个变量 的类型。很多情况下,变量类型可以根据上下文来自动判断,这样就可以省略类型声明。这里有一个可能是最简单的例子 :

val x = 1

在声明这个变量时,由于变量初始化为整型值,Kotlin 自动判断出它的类型是 Int。编译器这种从上下文推断变量类型的能力被称作类型推导。

下面罗列了一些静态类型带来的好处 :

  • 性能——方法调用速度更快,因为不需要在运行时才来判断调用的是哪个方法。
  • 可靠性——编译器验证了程序的正确性,因而运行时崩溃的概率更低。
  • 可维护性——陌生代码更容易维护,因为你可以看到代码中用到的对象的类型。
  • 工具支持——静态类型使 IDE 能提供可靠的重构、精确的代码补全以及其他 特性。

得益于 Kotlin 对类型推导的支持,你不再需要显式地声明类型,因此大部分关 于静态类型的额外冗长代码也就不复存在了。

当你检视 Kotlin 类型系统的细节时,你会发现许多熟悉的概念。类、接口以及 泛型和 Java 非常接近,所以大部分的 Java 知识可以很容易地转移到 Kotlin。然而, 也会有一些新概念出现。

其中最重要的概念是 Kotlin 对可空类型的支持,通过在编译期检测可能存在的 空指针异常,它让你可以写出更可靠的程序。

另一个 Kotlin 类型系统的新概念是对函数类型的支持。要搞清楚这一点,我们 先要了解函数式编程的主要思想,以及 Kotlin 是如何支持这种编程风格的。

函数式和面向对象

作为一个 Java 开发者,你一定对面向对象编程的核心概念烂熟于胸,但函数式 编程对你来说却可能很新鲜。函数式编程的核心概念如下 :

  • 头等函数——把函数(一小段行为)当作值使用,可以用变量保存它,把它 当作参数传递,或者当作其他函数的返回值。
  • 不可变性——使用不可变对象,这保证了它们的状态在其创建之后不能再变 化。
  • 无副作用——使用的是纯函数。此类函数在输入相同时会产生同样的结果, 并且不会修改其他对象的状态,也不会和外面的世界交互。

函数式编程风格的代码能给你带来什么好处 ? 首先,简洁。函数式风格的代码 比相应的命令式风格的代码更优雅、更简练,因为把函数当作值可以让你获得更强 大的抽象能力,从而避免重复代码。

假设你有两段类似的代码,实现相似的任务(例如,在集合中寻找一个匹配的 元素)但具体细节略有不同(如何判断元素是匹配的)。可以轻易地将这段逻辑中公 共的部分提取到一个函数中,并将其他不同的部分作为参数传递给它。这些参数本身也是函数,但你可以使用一种简洁的语法来表示这些匿名函数,它被称作 lambda 表达式 :

函数式编程风格的代码带来的第二个好处是多线程安全。多线程程序中最大的错误来源之一就是,在没有采用适当同步机制的情况下,在不同的线程上修改同一份数据。如果你使用的是不可变数据结构和纯函数,就能保证这样不安全的修改根 本不会发生,也就不需要考虑为其设计复杂的同步方案。

最后,函数式编程意味着测试更加容易。没有副作用的函数可以独立地进行测 试,因为不需要写大量的设置代码来构造它们所依赖的整个环境。

一般来说,函数式编程风格可以在任何编程语言中使用(包括 Java),它的很 多主张都被认为是良好的编程风格。然而并不是所有的语言都提供了语法和库支持, 让我们可以毫不费力地使用这种风格。例如,Java 8 之前的 Java 版本都缺少了这种 支持。Kotlin 拥有丰富的特性集从一开始就支持函数式编程风格,包括 :

  • 函数类型,允许函数接受其他函数作为参数,或者返回其他函数。
  • lambda 表达式,让你用最少的样板代码方便地传递代码块
  • 数据类,提供了创建不可变值对象的简明语法
  • 标准库中包括了丰富的 API 集合,让你用函数式编程风格操作对象和集合

Kotlin 允许你使用函数式编程风格但并没有强制你使用它。当你需要的时候, 可以使用可变数据,也可以编写带副作用的函数,而且不需要跳过任何多余的步骤。 然后,毫无疑问的是,在 Kotlin 中使用基于接口和类层次结构的库就像 Java 一样简 单。当编写 Kotlin 代码的时候,可以结合使用面向对象编程和函数式编程风格,并 使用最合适的工具来对付亟待解决的问题。

免费并开源

Kotlin 语言(包括编译器、库和所有相关工具)是完全开源的,并且可以自由使用。 它采用 Apache 2 许可证 ;其开发过程完全公开在 GitHub (http://github.com/jetbrains/ kotlin) 上,并且欢迎来自社区的贡献。如果你要开发 Kotlin 应用程序,有三种开源 IDE 供你选择 :IntelliJ IDEA Community2 版、Android Studio 以及 Eclipse,它们都完 全支持 Kotlin(当然,IntelliJ IDEA Ultimate 也支持 Kotlin。)

现在你明白了 Kotlin 是什么语言,让我们看看 Kotlin 在具体的实际应用中会给你带来哪些好处。

Kotlin应用

如前所述,Kotlin 使用的两个主要的领域是服务器端和 Android 开发。接下来 我们分别看看这两个领域,以及为什么 Kotlin 非常适合它们。

服务器端的 Kotlin

服务器端编程是一个非常大的概念,它包含了所有下列的应用程序类型甚至更多 :

  • 返回 HTML 页面给浏览器的 Web 应用程序
  • 通过 HTTP 暴露 JSON API 的移动应用后端服务
  • 通过 RPC 协议互相通信的微服务

多年以来,开发者一直在构建这些类型的应用,并且积累了大量的框架和技术 来帮助他们构建这些应用。这些应用通常并不是孤立地开发或者从零开始的,它们 几乎总是对现有的系统进行扩展、改进或者替换,新的代码必须和系统中现有部分 进行集成,而这些部分可能很多年之前就写成了。

这种环境下 Kotlin 的一大优势就是它与现有的 Java 代码无缝的互操作性。无论 是要编写一个全新的组件还是移植一个现有服务的代码,Kotlin 都毫无压力。不管 你需要在 Kotlin 中继承 Java 类,还是以某种方式注解一个类的方法或字段,都不会 遇到任何问题。它带来的优点是系统的代码会更紧凑、更可靠、更易于维护。

与此同时,Kotlin 还引入了许多用于开发这类系统的新技术。例如,对构建器 模式的支持让你可以使用更简洁的语法来创建任何对象图,同时保留了语言中全套 的抽象机制和代码重用工具。

这个特性的一个最简单的用例就是 HTML 生成库,它可以把一个外部模板语言 替换成简洁且完全类型安全的解决方案。这里有一个例子 :

可以轻松地把映射到HTML标签的函数和常规的Kotlin语言结构组合起来。你不再需要使用一门独立的模板语言,也不需要学习新的语法,仅仅使用循环就可以生成HTML页面。

另一个能用上Kotlin干净和简洁的DSL的用例是持久化框架。例如,Exposed 框架(https://github.com/jetbrains/exposed)就提供了易读的 DSL,可以完全使用 Kotlin 代码来描述 SQL 数据库的结构并执行查询操作,并且有全面的类型检查。下 面这个小例子展示了可行的做法 :

Android 上的 Kotlin

一个典型的移动应用和一个典型的企业应用完全不同。它更小,更少地依赖与 现有的代码集成,通常需要快速交付,同时需要保证在大量的设备上能够可靠地运 行。这类项目 Kotlin 也能胜任。

Kotlin 的语言特性,加上支持 Android 框架的特殊编译器插件,让 Android 的 开发体验变得高效和愉悦。常见的开发任务,比如给控件添加监听器或是把布局元 素绑定到字段,可以用更少的代码完成,有时甚至根本不用写任何代码(编译器会帮你生成)。同样由 Kotlin 团队打造的库 Anko(https://github.com/kotlin/anko)给许多标准 Android API 添加了 Kotlin 友好的适配器,进一步提升了 Android 的开发体验。

下面是 Anko 的一个简单例子,可以品尝到使用 Kotlin 进行 Android 开发的滋味。只要把这段代码放在一个 Activity 中,一个简单的 Android 应用就做好了!

使用Kotlin带来的另一优势就是更好的应用可靠性。如果你有开发Android应用的经验,你一定对“Unfortunately, Process Has Stopped”对话框深恶痛绝。如果你的应用有未处理的异常,这个对话框就会出现,而这种异常一般是NullPointerException(空指针异常)。Kotlin的类型系统通过精确地跟踪null值,大大减轻了空指针异常问题带来的压力。大部分Java中会导致NullPointerException的代码在Kotlin中无法编译成功,以确保这些错误在应用到达用户手中之前得到修正。

同时,由于 Kotlin 完全兼容 Java 6,使用它并不会带来任何新的编译问题。你 可以享受所有 Kotlin 的酷炫新特性,而你的用户仍然可以在他们的设备上使用你的 应用,即使他们的设备并没有运行最新版本的 Android 系统。

说到性能,Kotlin 也没有带来任何负面影响。Kotlin 编译器生成的代码执行起 来和普通的 Java 代码效率一样。Kotlin 使用的运行时(库)体积相当小,所以编译 出来的应用程序包体积也不会增加多少。当你使用 lambda 的时候,它们会被许多 Kotlin 标准库函数内联。lambda 的内联确保不会创建新对象,因此应用程序也不必 忍受额外的 GC 暂停。

看过了和 Java 相比 Kotlin 的优势之后,我们再来看看 Kotlin 的设计哲学——那 些把 Kotlin 和其他面向 JVM 的现代语言区分开的主要特性。

Kotlin的设计哲学

当谈起 Kotlin 的时候,我们喜欢说它是一门务实、简洁和安全的语言,专注于 互操作性。这里的每个词语究竟是什么含义?我们逐个来看看。

务实

务实对我们来说意味着一件简单的事情 :Kotlin 就是一门设计出来解决现实世界问题的实用语言。它的设计基于多年创建大型系统的工业经验,它的特性也是为解决许多软件开发者遇到的场景而选择的。此外,来自 JetBrains 内部和社区的开发者已经使用 Kotlin 的早期版本很多年,他们的反馈也被融合进了这门语言公开发布的版本中。所以我们才能自信地说,Kotlin 能够帮助解决实际项目的问题。

Kotlin 也不是一门研究性的语言。我们没有试图提升编程语言设计领域目前的技术水平,也没有尝试探索计算机科学的创新理念。反而,我们会尽可能地依赖已经出现在其他编程语言中并被证明是成功的那些特性和解决方案。这降低了语言的复杂性,也让它更容易学习,因为你可以仰仗那些熟悉的概念。

此外,Kotlin 也没有强制使用某种特定的编程风格和范式。当你开始学习这门语言的时候,可以使用熟悉的来自 Java 经验的风格。然后,你会渐渐地发现更多强大的 Kotlin 特性,并学习把它们应用到你的代码中,让代码更简洁、更符合语言习惯。

Kotlin 的实用主义的另一个重要体现是对于工具的专注。对开发者的生产力而言,一个智能的开发环境和一门设计良好的语言同样重要。因此,事后再来考虑对 IDE 进行支持就是马后炮。而 Kotlin 的情况是,IntelliJ IDEA 的插件是和编译器同步开发的,并且在设计语言特性时始终牢记着对工具的支持。

IDE 支持对帮助你探索 Kotlin 的特性也发挥着重要作用。许多情况下,工具会发现那些可以用更简洁的结构来替换的通用代码模式,并给你提供修正这些代码的选择。通过研究自动修正所使用的语言特性,你就能学习如何在自己的代码中应用这些特性。

简洁

和编写新代码相比,开发人员会耗费更多的时间来阅读现有代码,这已经是常识。想象一下你所在的团队正在开发一个大项目,而你的工作是添加一个新特性或者修改 bug。第一步会干什么?首先要找到需要改变的那段代码,然后才能实现你的修改。要阅读很多代码才能知道你要做什么。这些代码可能最近刚完成,由你的同事或者是那些已经离开的同事编写,或者是你自己很久之前写好的。只有搞懂了周围的代码你才能做出正确的改动。

代码越简单越简洁,你就能越快地了解发生了什么。当然,良好的设计和达意的命名在这里起着重要的作用。但语言的选择及其简洁性也很重要。如果语言的语法清晰地表达了被阅读的代码的意图,没有因为达成意图所需的样板代码而晦涩难懂,那么它就是简洁的。

在 Kotlin 中,我们努力地保证你写的代码都具有实际的意义,而不是仅仅为了满足代码结构的需要。许多标准的 Java 样板代码,例如 getter、setter 以及将构造方法的参数赋值给字段的逻辑,在 Kotlin 中都是隐式的,并不会使你的源代码变得混乱。

另外一个导致代码变得不必要的冗长的原因是编写显式的代码来完成常见的任务,比如定位集合中的元素。和许多其他现代语言一样,Kotlin 有丰富的标准库,让你用库方法调用来代替这些冗长重复的代码段。Kotlin 对 lambda 的支持,让小代码块可以轻松地传递给库函数。这让你可以把公共的那部分代码全部封装在库中,而在用户代码中仅保留特定的针对任务的那部分。

与此同时,Kotlin 并没有尝试把源代码压缩到最小可能的长度。例如,即使 Kotlin 支持运算符重载,用户也不能定义自己的运算符。因此,库开发者不能用神秘的标点符号序列来代替方法名字。单词比标点符号显然更易读,也更容易找到相关的文档。

越简洁的代码写起来花的时间越短,更重要的是,读起来耗费的时间也更短。这会提高你的生产力并让你更快地达成目标。

安全

通常,我们说一门编程语言是安全的,我们的意思是它的设计可以防止程序出现某些类型的错误。当然,这并不意味着绝对的高质量,没有任何语言可以阻止所有可能出现的错误。此外,预防错误是需要成本的。需要给编译器提供程序有关预期操作更多的信息,这样编译器才能验证这些信息是否和程序的功能匹配。因此,你要在得到的安全级别和因为增加更多细节注解而造成的生产力损失之间权衡利弊。

使用 Kotlin,我们试图实现比 Java 更高的安全级别,同时保持更低的总体成本。在 JVM 上运行已经提供了许多的安全保证 :例如,内存安全,防止了缓冲区溢出以及其他错误的动态内存分配造成的问题。作为面向 JVM 的静态类型语言,Kotlin 还保证了应用程序的类型安全。这比使用 Java 的成本要更低 :不需要指定所有的类型声明,因为许多情况下编译器会自动地推断出类型。

Kotlin 所做的不止这 些,这意味着更多的原本在运行时失败的错误在编译期的检查中就被阻止 了。最重要的一点是,Kotlin 努力地从你的程序中消除 NullPointerException。Kotlin 的类型系统跟踪那些可以或不可以为 null 的值,并且禁止那些运行时可能导致 NullPointerException 的操作。这所带来的额外的成本是极小的 :把类型标记为可空的只要一个字符,就是类型尾部的一个问号 :

除此之外,Kotlin 提供了许多便利的方法来处理可空数据。这非常有助于消灭应用程序的崩溃。

Kotlin 有助于避免的另一种异常类型就是 ClassCastException。当你把一 个对象转换成一种类型,而没有事先检查它是否是正确的类型时,就会发生这个异 常。在 Java 中,开发者常常省略了这类检查,因为必须反复地在检查和其后的转换 中写明类型名称。另一方面,Kotlin 中的检查和转换被组合成了一次操作 :一旦检 查过类型,不需要额外的转换就能直接引用属于这个类型的成员。这样,开发者就 没有借口跳过检查,也不会给错误留下可乘之机。下面展示了它是如何工作的 :

互操作性

关于互操作 性,你的第一个问题可能是 :“我是不是可以继续使用现有的 库?”Kotlin 给出的回答是 :“当然可以。”无论需要使用哪种库提供的 API,都可 以在 Kotlin 中使用它们。可以调用 Java 的方法,继承 Java 的类和实现 Java 的接口, 在 Kotlin 类上应用 Java 的注解,等等。

与其他一些 JVM 语言不同,Kotlin 在互操作性上更上一层楼,让 Java 代码也 可以毫不费力地调用 Kotlin 的代码。无须取巧 :Kotlin 的类和方法可以像常规的 Java 类和方法一样被调用。这带来了无限的灵活性,在项目的任何地方都可以混合 使用 Java 和 Kotlin。当你刚开始在自己的 Java 项目中引入 Kotlin 时,可以在代码库 中的任意一个类上运行 Java 到 Kotlin 的转换器,剩下的代码不需要任何修改就可以 继续编译和工作。不管你所转换的类是什么角色,这都是可行的。

另一个 Kotlin 专注于互操作性的领域是在最大程度上使用现有的 Java 库。例如, Kotlin 没有自己的集合库,它完全依赖 Java 标准库中的类,使用额外的函数来扩展 它们,让它们在 Kotlin 中用起来更方便(我们会在 3.3 节中了解这种机制更多的细节)。 这意味着在 Kotlin 中调用 Java API 时,永远不需要包装或者转换这些 Java 对象,反 之亦然。所有这些 Kotlin 提供的丰富的 API 在运行时没有任何的额外开销。

Kotlin 工具也对跨语言项目提供了全面支持。它可以编译任意混合的 Java 和 Kotlin 源码,不管它们之间是怎样互相依赖的。IDE 的特性也能跨语言工作,允许 :

  • 自由地在 Java 和 Kotlin 源码文件之间切换
  • 调试混合语言的项目,可以在不同语言编写的代码之中单步调试
  • 重构 Java 方法的时候,Kotlin 代码中的对它们的调用也会得到正确的更新,反之亦然

希望我们已经说服你尝试一下 Kotlin。现在,你要如何开始使用它?在接下来 的一节中,我们将从命令行和其他不同工具的使用两方面讨论编译和运行 Kotlin 代 码的过程。

使用Kotlin工具

和 Java 一样,Kotlin 也是编译型语言。这意味着你必须先编译,然后才能执行 Kotlin 代码。让我们来讨论一下编译过程,然后看看帮你完成这个过程需要的不同工具。如果你需要关于如何搭建开发环境的信息,请参考 Kotlin 官方网站的“Tutorials”(教程)一节 (https://kotlinlang.org/docs/tutorials)。

编译 Kotlin 代码

Kotlin 的源代码存放在后缀名为 .kt 的文件中。Kotlin 编译器会分析源代码并生成 .class 文件,这和 Java 编译器做的没什么不同。然后按照你正在处理的应用程序类型的标准过程打包和执行生成的 .class 文件。最简单的情况下,只需要使用 kotlinc 命令就可以从命令行编译代码,然后就可以用 java 命令执行你的代码 :

kotlinc <source file or directory> -include-runtime -d <jar name>java -jar <jar name>

图1.1展示了Kotlin构建过程的简单描述。


图 1.1 Kotlin 构建过程

用 Kotlin 编译器编译的代码依赖 Kotlin 运行时库。它包括了 Kotlin 自己的标准 库类的定义,以及 Kotlin 对标准 Java API 的扩展。运行时库需要和你的应用程序一 起分发。

在大多数实际工作的例子中,你会使用像 Maven、Gradle 或者 Ant 这样的构建系统来编译你的代码。Kotlin 和所有这些构建系统都兼容,我们会在附录 A 中讨论相关细节。所有这些构建系统也支持在同一个代码库中既有 Kotlin 也有 Java 的混合语言项目。此外,Maven 和 Gradle 还会帮你把 Kotlin 运行时库作为依赖加入到你的应用程序中。

IntelliJ IDEA 和 Android Studio 插件

IntelliJ IDEA 的 Kotlin 插件是和语言同步开发的,它是 Kotlin 可用的功能最全面的开发环境。它成熟且稳定,提供了 Kotlin 开发所需的全套工具。

IntelliJ IDEA 15 及 其后 续版 本不 需 要额 外的 设 置,Kotlin 插 件就可以开箱即用。可以选择免费开源的 IntelliJ IDEA Community 版,也可以选择 IntelliJ IDEA Ultimate。在“New Project”(新建项目)对话框中选择“Kotlin”,然后就可以开始工作了。

如果你用的是 Android Studio,可以从“plug-in manager”(插件管理器)中安装 Kotlin 插件。打开“Settings”(设置)对话框,选择“Plugins”(插件),单击“Install JetBrains Plugin”(安装 JetBrains 插件)按钮,然后从列表中选择“Kotlin”。

交互式 shell

如果你想快速地尝试小段的 Kotlin 代码,可以使用交互式 shell( 也叫 REPL3 )。 在 REPL 中,可以逐行地输入 Kotlin 代码并立即看到其执行结果,可以使用不带任 何参数的 kotlinc 命令启动 REPL,也可以从 IntelliJ IDEA 的“Kotlin”菜单中选 择启动 REPL。

Eclipse 插件

如果你是 Eclipse 用 户,同样可以选择在你的 IDE 中使用 Kotlin。Kotlin 的 Eclipse 插件提供了必要的 IDE 功能,如导航和代码补全。该插件可以在 Eclipse Marketplace 中找到。要安装它,请选择“Help > Eclipse Marketplace”菜单项,然后在列表中搜索“Kotlin”。

在线 playground

尝试 Kotlin 的最简单的方式,是不需要任何安装和配置。可以在 http://try.kotl.in 找到在线的 playground,可以在上面编写、编译及运行 Kotlin 的小程序。Playground 上还展示了 Kotlin 特性的代码示例,其中包括了本书中的所有例子,还有一系列交互式学习 Kotlin 的练习。

Java 到 Kotlin 的转换器

要熟练掌握一门新语言总是要费点力气的。幸运的是,我们开辟了一条很棒的小捷径,让你可以借助现有的 Java 知识来加快学习和运用 Kotlin 的速度。这个工具就是 Java 到 Kotlin 的自动转换器。

当你开始学习 Kotlin 的时候,如果你还没有记住准确的语法,转换器能帮你表达一些内容。可以先用 Java 写出相应的代码片段,然后把它粘贴到 Kotlin 文件中,转换器会自动地将代码转换成 Kotlin。转换的结果不一定总是符合语言习惯,但是它一定是可以工作的代码,这样就可以让你的任务更进一步了。

在现有的 Java 项目中引入 Kotlin 时,转换器也很好用。当你写一个新类时,可以从一开始就用 Kotlin。但是如果你要在一个现有的类上做重大的更改时,可能也想在这个过程中使用 Kotlin,这时转换器就派上用场了。首先把这个类转换成 Kotlin,然后就可以利用现代编程语言的所有优势来添加更改了。

在 IntelliJ IDEA 中使用转换器再简单不过了。要么复制一段 Java 代码粘贴到 Kotlin 文件中,要么触发“Convert Java File to Kotlin File”(转换 Java 文件到 Kotlin 文件)动作来转换整个文件。也可以在 Eclipse 中或者线上使用转换器。

小结

  • Kotlin 是静态类型语言并支持类型推导,允许维护正确性与性能的同时保持源代码的简洁。
  • Kotlin 支持面向对象和函数式两种编程风格,通过头等函数使更高级别的抽象成为可能,通过支持不可变值简化了测试和多线程开发。
  • 在服务器端应用程序中它工作得很好,全面支持所有现存的 Java 框架,为常见的任务提供了新工具,如生成 HTML 和持久化。
  • 在 Android 上它也可以工作,这得益于紧凑的运行时、对 Android API 特殊的编译器支持以及丰富的库,为常见 Android 开发任务提供了 Kotlin 友好的 函数。
  • 它是免费和开源的,全面支持主流的 IDE 和构建系统。
  • Kotlin 是务实的、安全的、简洁的,与 Java 可互操作,意味着它专注于使用已经证明过的解决方案处理常见任务,防止常见的像 NullPointerException 这样的错误,支持紧凑和易读的代码,以及提供与 Java 无限制的集成。


作者: Dmitry Jemerov 从2003年起就在 JetBrains ⼯作并参与了许多产品的开发,包括IntelliJ IDEA、PyCharm 和 WebStorm。他是 Kotlin 最早的贡献者之⼀,创建了最初版本的 Kotlin JVM 字节码⽣成器,并且还在世界各地的活动上做了很多关于 Kotlin 的演示。⽬前他带领了进⾏ Kotlin IntelliJ IDEA 插件开发的团队。
Svetlana Isakova 从2011年成为 Kotlin 团队的⼀员。她从事编译器类型推导和重载解析⼦系统的⼯作。现在她是⼀名技术布道者,在各种会议上进⾏ Kotlin 相关讨论并从事 Kotlin 在线课程的相关⼯作。
本文选自《Kotlin实战》第 1 章。

评论