正如我们之前提到的,Kotlin的两个主要应用领域是服务器端和Android开发。让我们看看依次这些领域以及为什么Kotlin适合它们。
1.3.1 服务器端的Kotlin
服务器开发是一个相当宽泛的概念。它包括以下所有类型的应用和更多的其他应用:
- 向浏览器返回HTML页面的web应用
- 通过HTTP协议来向移动应用暴露JSON API的后台应用
- 通过RPC协议进行通信的微服务
多年来,开发者一直使用Java构建这些种类的应用。如今,我们已经积累了一大堆的框架和技术来辅助应用的开发。这些应用通常都不是独立的或者从零开始开发的。世上几乎总是有现存的系统被扩展、升级或被替代。新的代码必须集成到现有系统的一部分。而这部分代码可能在很多年之前就编写好了
在这样的环境下,Kotlin最大的一个优势是它能够与现有Java代码进行无缝的交互。无论你是否编写一个新的组件或者移植已有代码到Kotlin,Kotlin都会非常适合。当你需要在Kotlin中扩展Java类或者以特定的方式标注类方法以及类属性时,你不会遇上问题。这样的好处是系统代码将会更加紧凑、可靠和易于维护。
与此同时,Kotlin为开发这样的系统准备了许多的新技术。例如,它对建造者模式的支持允许你用精简的语法来创建任意的对象图。它也保留了全套的抽象和语言方面的代码重用工具。
这个特性最简单的一个用例是一个HTML生成库。这个库能够用精简和完全类型安全的方案来替代外部模板语言。示例如下:
fun renderPersonList(persons: Collection<Person>) =
createHTML().table { // 1
for (person in persons) { // 2
tr { // 1
td { +person.name } // 1
td { +person.age } // 1
}
}
}
// 1 映射为HTML标签的函数
// 2 一个常规的Kotlin循环
如你所见,你可以很容易的把映射HTML标签的函数和常规的Kotlin语言构造组合起来。你不再需要使用单独的模板语言。它独立的语法有待学习。当你生成HTML页面时,你只需要使用一个循环。
另一个你能够使用Kotlin的整洁、精简的DSL的用例是持久化框架。举个例子,Exposed
框架提供了一种简单的方式来读取描述SQL数据库结构的DSL。而且它完全通过Kotlin代码来执行查询。它有全面的类型检查。这里有一个小案例来向你展示可能的情况:
object CountryTable : IdTable() { // 1 描述数据库中的表
val name = varchar("name", 250).uniqueIndex()
val iso = varchar("iso", 2).uniqueIndex()
}
class Country(id: EntityID) : Entity(id) { // 2 创建一个数据库实体对应的类
var name: String by CountryTable.name
var iso: String by CountryTable.iso
}
val russia = Country.find { // 3 你可以仅使用Kotlin代码查询这个数据库
CountryTable.iso.eq("ru")
}.first()
println(russia.name)
我们将会在书中的后续部分,委托属性一节和第11章详细的考虑这些技术。
1.3.2 Kotlin 在Android方面的应用
一个典型的移动应用和一个典型的企业级应用是非常不一样的。移动应用更加的小。它与现有集成代码的依赖较少。它经常需要快速分发同时要确保在各种设备可靠的运行。Kotlin恰好也能用于那种项目。
Kotlin的语言特性,结合支持Android框架的编译器特殊插件,把Android开发变为一个更具生产效率和舒适的体验。诸如为控件添加侦听器或者绑定布局元素到字段的常见开发任务,能够使用更少的代码来实现。有时候根本不需要代码(编译器会为你生成代码)。Anko库也是由Kotlin团队构建的。即便需要进一步在许多的标准Android API外围添加Kotlin友好的适配器。,它仍然提升了你的体验
这里有一个简单的Anko示例,只是为了让你体验一下使用Kotlin开发Android是一种什么样的感觉。你可以把这份代码放到一个Activity
中,一个简单Android应用就准备好了!
verticalLayout {
val name = editText() // 1 创建一个简单文本域
button("Say Hello") { // 2 被点击时,这个按钮会显示文本域的值
onClick { toast("Hello, ${name.text}!") } // 3 附加侦听器和展示面包条的精简API
}
}
另一个使用Kotlin的巨大优势是能够获得更好的应用可靠性。如果你有更多Android应用开发经验,对于Unfortunately, Process Has Stopped
对话框,你将不会陌生。当你的应用抛出一个未处理的异常时,通常是NullPointerException
,这个对话框将会出现。Kotlin的类型系统使用它的精确的空值跟踪特性来让空指针异常变得没那么迫切。大部分的代码在Java中会导致NullPointerException
,在Kotlin中会编译失败,这将确保你在应用到达用户手上之前修复错误。
同时,因为Kotlin是完全兼容Java6的,它的使用不会引入任何新的兼容性问题。你将会受益于Kotlin所有的既酷又新的特性。你的用户将会依然能够在他们的设备上运行你的应用,即使他们不是在最新版的Android上运行。
在性能方面,使用Kotlin也不会带来任何的坏处。Kotlin编译器产生的代码和常规的Java代码在执行时同样高效。Kotlin占用的运行时资源非常小,因此你不会遇到应用安装包大小会大幅增加的问题。当你使用lambda表达式时,许多的Kotlin标准库函数将会以内联的方式出现。内联lambda表达式确保没有新的对象会被创建,同时,应用不会遭遇额外的垃圾回收暂停问题。
考虑Kotlin和Java之间的比较优势,让我们现在看看Kotlin的哲学--使得Kotlin与其他运行在JVM上的现代语言出现区别的主要特性。