对于Kotlin是一种什么样的编程语言,你可能已经有一定的想法了。让我们更详细地看看它的关键属性吧。首先,让我们来看看你能用Kotlin构建什么样的应用。
1.2.1 目标平台:服务器端、Android以及运行Java的其他平台
Kotlin的首要目标是为Java提供更加简洁、更具生产效率、更安全的可选方案。它适合当下所有用到Java的场景。Java是极度流行的编程语言。它被用于各种各样的环境。小到智能卡(Java卡片技术),大到谷歌、推特、领英和其他大企业的数据中心。在大多数这些场景,使用Kotlin能够帮助开发者全程以更少的代码和繁杂事务来实现你的目标。
Kotlin的常见领域:
- 构建服务器端代码(通常是web后台应用)
- 构建运行于Android设备的移动应用
但是Kotlin也能在其他场合工作。举个例子,你可以使用Intel Multi-OS 引擎在iOS设备上运行Kotlin代码。你也能够配合使用JavaFX和Kotlin来构建桌面应用。
在Java之外,Kotlin也能编译成Javascript。这将允许你在浏览器端运行Kotlin代码。写这本书时,Kotlin对JavaScript的支持在JetBrains公司内部仍然处于探索和原型阶段。因此,它不在本书的讨论范围内。Kotlin的后续版本也将会考虑其他的平台。
如你所见,Kotlin的目标是如此之广阔。kotlin并不局限于单一领域的问题或者解决现代软件开发者所面临的单一类型的挑战。相反,它为开发过程中出现的所有任务带来全面的效率提升。对于特定领域或编程范式的库,Kotlin为你提供了良好的集成。接下来让我们来看看Kotlin作为一门编程语言的关键特性。
1.2.2 静态类型
就像Java
那样,Kotin
是一种静态类型的编程语言。这意味着在编译时就可以确定程序中每一个表达式的类型。编译器可以验证你所访问的对象中的方法和字段。
这(种特性)跟JVM的具有代表性的动态类型编程语言,比如Groovy和JRuby,形成对比。那些语言允许你定义能够存储或返回任何数据类型的变量和函数,并且可以在运行时解析方法和字段引用。这样的代码更简短,在创建数据结构时也更为灵活。但它也有缺点,诸如无法在编译时检测命名拼写错误,并导致运行时错误这样的问题。
另一方面,跟Java相比,Kotlin并不需要你在代码中显式的指定每一个变量的类型。在许多场景中,变量类型能够根据上下文自动推断。这将允许你省略类型声明。
以下是一个最简单的例子:
var x = 1
你声明了一个变量。由于它以一个整数值进行初始化,Kotlin自动推断这个变量的类型为Int
。编译器根据上下文判断变量类型的能力叫做类型推断。
以下是静态类型的一些好处:
- 性能 - 由于不需要再运行时判断需要调用哪个方法,方法调用将会变得更快。
- 可读性 - 编译器校验了程序的准确性,所以在运行时发生崩溃的可能性将会降低。
- 可维护性 - 由于你能看到代码调用了什么类型的对象,使用不熟悉的代码将会变得更加容易。
- 工具支持 - 静态类型使得可靠的重构、精确的代码填充和其他的IDE特性变得可能。
由于Kotlin对类型推断的支持,大部分跟静态类型有关的冗余信息将会消失,因为你不需要显示指定类型。
如果你考究Kotlin类型系统的细节,你将会发现许多熟悉的概念。类、接口和泛型以类似于Java的方式出现。所以你大部分的Java知识应该能够很快速的转变为Kotlin的。尽管Kotlin里面有些东西是新的。
其中最重要的一点是Kotlin支持可以为空的类型(nullable type)。通过在编译时检查可能的空指针异常,这一特性将使你编写更可靠的程序。我们将会在这一章的后续部分回到可为空的类型,并在第六章详细的讨论。
Kotlin类型系统中的另一个新事物是它所支持的函数类型(functional types)。为了了解这是什么,我们先看看函数式编程的主要思想以及Kotlin是如何支持它的。
1.2.3 函数式和面向对象
作为一个Java程序员,毫无疑问,你对面向对象编程的核心概念了如指掌。但是你可能对函数式编程感到陌生。函数式编程的关键概念如下:
- 函数是一等公民 - 你把函数(行为块)看做是一个值。你可以把。存储在变量中,把它们作为一个参数进行传递或者从其他函数中返回它们。
- 不变性 - 你使用的是不可改变的对象。一旦它被创建,它的状态便不可更改。
- 没有副作用 - 你使用的纯函数对于给定的相同输入将会返回相同的结果。同时,它不会修改其他对象的状态或者和外界进行交互。
以函数式风格编写代码,你能从中得到好处呢?首先,它很简洁。跟对应的指令式代码相比,函数式代码会更加优雅和简洁。因为把函数当做一个值将会给你带来更强大的抽象能力,这将避免你的代码出现冗余。想象一下你有两段相似的代码。它们用于完成一个类似的任务(例如:查找集合中的匹配元素),但是细节方面(如何匹配检测到的元素)不一样。你可以简单的把共同的逻辑提取到一个函数中,并将不同的部分当做参数进行传递。参数是函数自身的,但是你可以使用为匿名函数准备的lambda表达式来表达:
fun findAlice() = findPerson { it.name == "Alice" } // 1 findPerson()包含了人名查找的通用逻辑
fun findBob() = findPerson { it.name == "Bob" } // 2 大括号里面的代码块指定了你想查找的具体的人
函数式代码的第二个好处是多线程安全。多线程程序中的一个最大的错误来源是没有正确的同步的情况下修改了来自多个线程的同一个数据。如果你使用了不可修改的数据结构和纯函数,你可以确保不会出现不安全的修改。同时你不需要去设计复杂的同步方案。
最后,函数式编程意味着容易测试。没有副作用的代码通常更容易测试。函数能够被隔离测试而无需一堆安装代码来构造函数所依赖的完整环境。
一般而言,函数式风格能够被用于包括Java
在内的任何编程语言中。它其中的许多部分也被视为为良好的编程风格。但是并非所有的语言都提供了易于使用的语法和库支持来使用函数式编程。例如:Java8以前的Java版本都没有提供大部分的函数式支持。Kotlin从一开始就有着丰富的特性来支持函数编程。具体如下:
- 函数类型 允许函数接收作为参数的其他函数或者返回其他函数
- lambda表达式 让你使用最小的模板分发代码块
- 数据类 为创建不可变值对象提供了精简的语法
API 标准库为以函数式风格使用对象和集合提供了丰富的API
Kotlin允许你使用函数式风格进行编程,但是不强制使用。当你有需要时,你可以毫无障碍的使用可变数据以及编写有副作用的函数。当然,使用基于接口和类继承的框架和Java一样的方便。用Kotlin写代码时,你可以将面向对象和函数式方法混合使用,同时,使用最合适的工具来解决问题。
1.2.4 免费、开源
不管是什么用途,Kotlin,包括编译器、函数库和所有相关的库都是完全开源和免费的。Kotlin使用Apache 2许可。它在GitHub的开发上是开放的。同时我们欢迎社区贡献。你也有三种可选的开源集成开发环境来开发Kotlin应用:IntelliJ IDEA 社区版、Android Studio和Eclipse都是完全支持的(当然IntelliJ IDEA 旗舰版亦可)。
现在你应该理解Kotlin是一种什么样的编程语言了,我们看看Kotlin在具体的应用实践中有什么样的好处。