Mark Platvoet 是一名热衷于研究新的编程语言、技术和方法的 Java 和.NET 开发者。最近,他为 JetBrains 推出的新语言 Kotlin 所吸引,并于近日撰文介绍了这门颇具生产力的语言。
许多语言似乎都是源于对某种其它语言的厌倦。在Mark 看来,Kotlin 应该也属于这种情况。不过他觉得,JetBrains 的工程师仍然将Java 视为一门优秀的语言。只是,Java 太成熟了,改进和增加特性比较困难,因为要保持向后兼容。Kotlin 所做的工作就是吸取Java 和其它语言的经验和教训,并以此为基础进行改进。
Kotlin 处理null
的方式是 Mark 最喜欢的特性之一。以下面的 Java 方法为例:
public void foo(Bar bar) { /*…*/ }
对于这样一个典型的方法,如果传入的参数为null
,那么通常的处理方式是检查输入:
public void foo(Bar bar) { if (bar == null) throw IllegalArgumentException(); /*…*/ }
如果调用该方法时传入了null
,那么它会抛出异常,并提供有用的信息。但这要到运行的时候才能看到。如果方法定义本身就能明确表达不接受null
参数的意图就好了。于是,上述代码可以进一步改进为:
public void foo(@NotNull Bar bar) { if (bar == null) throw IllegalArgumentException() /*…*/ }
如此一来,像 IntelliJ IDEA 这样的工具在检测到调用者可能传入null
时就会提醒开发者。这样的代码没错,但就是有点啰嗦。
Kotlin 采用了一种不同的null
处理方式。它对可空类型和不可空类型作了区分,可空的类型后面会跟一个问号,比如*Bar?*
,而*Bar*
类型的变量则不可为空。于是,在 Kotlin 中,上述 Java 代码就变成了下面这样:
public fun foo(bar : Bar) { /*…*/ }
Mark 认为,Kotlin 非常简洁且富有表现力。这从上面的例子可见一斑。Mark 还特别指出,他所说的表现力是指代码可以明确的表达开发者的意图,而且有良好的可读性。
Kotlin 的互操作性是 Mark 提到的另一特性。Kotlin 与 Java 的互操作性非常好。开发者可以直接从 Kotlin 中调用 Java 代码,而且不需要任何外观模式或其它中间逻辑;从 Java 调用 Kotlin 同样简单。Kotlin 文件和 Java 文件可以自由混合。即使是现有的 Java 项目,也可以利用 Kotlin,而那些经过严格测试的核心代码可以保持不变。Kotlin 运行在 JDK 6 上,这将使 Android 开发者可以利用 Java 近几年的发展成果,比如 Lambda 表达式。
无独有偶。开发者 Mike Hearn 近日也在 Medium 上发表了一篇赞美 Kotlin 的文章,题为《为什么 Kotlin 是我的下一门编程语言》。Mike 非常喜欢 Kotlin,在未来 5 到 10 年中,他可能都会使用这门语言。Mike 根据自己的经验将 Kotlin 的优势总结为如下几点:
- Kotlin 编译成 JVM 字节码或 JavaScript——这不仅会吸引 Java 开发人员,还会吸引所有使用垃圾收集运行时的开发人员,比如使用 Scala、Go、Python、Ruby 和 JavaScript 的开发人员。
- Kotlin 来自业界,而非学术界——它解决了程序员现如今在工作中面临的问题。
- 采用成本低——JetBrains 提供了高质量的转换工具(可以实现 Java 到 Kotlin 代码的一键转换),而且特别注重 Java 二进制兼容性。开发者可以一次仅转换现有 Java 项目中的一个文件,整个项目仍然可以正常编译。
- Kotlin 程序可以使用所有现有的 Java 框架和库,并可以集成 Maven、Gradle 和其它构建系统。
- 易于学习——Kotlin 语法简洁直观,看上去非常像 Scala,但更简单。 它不遵循特定的编程哲学,如函数式风格或面向对象风格。
- 不增加运行时开销——Kotlin 标准库非常紧凑,主要包含 Java 标准库的扩展。
- 适合 Android 开发——借助像 Anko 和 Kovenant 这样的框架,Kotlin 将在 Android 开人员中流行。
- IntelliJ 对 Kotlin 提供了良好的支持。
Mike 的部分观点与 Mark 不谋而合。此外,Mike 还总结了 Kotlin 的一些优秀特性,感兴趣的读者可以进一步阅读。
感谢郭蕾对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。
评论