10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

为什么应该学习 Kotlin

2015 年 9 月 28 日

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 读者交流群)。

2015 年 9 月 28 日 19:006498
用户头像

发布了 1008 篇内容, 共 325.1 次阅读, 收获喜欢 297 次。

关注

评论

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

面试官:展开说说,Spring中Bean对象是如何通过注解注入的?

小傅哥

spring 小傅哥 注解注入

ToastUtil实用封装

Changing Lin

8月日更

2021年阿里Java高级面试题分享

策划Java工程师

Java 程序员 后端

kubernetes入门:简介与基础操作命令

小黄鸡1992

8月日更

2021年最新Java大厂面试题来袭

策划Java工程师

Java 程序员 后端

用微服务架构方式交付云服务产品

用友YonBIP

容器 微服务 专属云

2021最新Java中级面试题目汇总解答

策划Java工程师

Java 程序员 后端

十大排序算法--希尔排序

阿粤Ayue

排序算法 8月日更

华为云UGO:醒醒!你的异构数据库迁移难题有救了

华为云开发者社区

数据库 迁移 华为云 异构数据库 UGO

2021年最新大厂Java面试笔试题目

策划Java工程师

Java 程序员 后端

2021最值得加入的互联网公司有哪些

策划Java工程师

Java 程序员 后端

取经之旅第 55 天,Python OpenCV 透视变换前置知识轮廓坐标点

梦想橡皮擦

8月日更

手撕环形队列系列三:多生产者并行写入

实力程序员

程序员 数据结构 C语言 编程开发 环形队列

企业需要拥有自己特色的DevOps

用友YonBIP

Docker 容器 DevOps 微服务

上K8s,研发团队如何从容一点?

云原生开发者社区

容器 k8s

百度第25季黑客马拉松再秀“技术基因”,累计产生创意超7000个

科技热闻

软件架构模式之微服务架构

架构精进之路

架构 微服务 8月日更

2021年春招Java面试题

Java 程序员 后端

2021我的Java路要怎么走

策划Java工程师

Java 程序员 后端

如何在渲染之前等待 Axios 数据?

DisonTangor

前端 React axios

netty系列之:netty中的ByteBuf详解

程序那些事

Java Netty nio 程序那些事

手撸二叉树之二叉搜索树的最近公共祖先

HelloWorld杰少

数据结构与算法 8月日更

一次Http Get请求健壮性问题的排查过程

liuzhen007

8月日更

容器云平台和Kubernetes之间不得不说的那些事

用友YonBIP

Kubernetes 容器云

【LeetCode】有效三角形的个数Java题解

HQ数字卡

算法 LeetCode 8月日更

极客-大数据-作业4 Hive

西伯利亚鼯鼠

【Flutter 专题】78 图解 Android Native 集成 FlutterBoost 小尝试 (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

2021最新Java开发者学习路线

策划Java工程师

Java 程序员 后端

springcloud 微服务日志写入kafka

Rubble

kafka Spring Cloud 8月日更

2021年阿里Java高级面试题及答案

策划Java工程师

Java 程序员 后端

2021必看-Java高级面试题总结

策划Java工程师

Java 程序员 后端

开源中间件技术学习路线

开源中间件技术学习路线

为什么应该学习Kotlin-InfoQ