2016年2月15日,Kotlin官方发布Kotlin 1.0 Released消息

1.0版本发布意味着Kotlin已被认为有足够的信心进行大规模推广,进入生产环境

笔者写下这篇短文,抛砖引玉地、走马观花地介绍下Kotlin语言的背景、特色,希望大家对这门新兴的语言有所了解、激发兴趣

Kotlin是个啥

按照Kotlin官网的说法

Statically typed programming language for the JVM, Android and the browser

100% interoperable with Java™

按照笔者的理解

Kotlin之于Java,正如Swift之于Object-C

Kotlin站在Java这位巨人的肩膀上,提供更高效的开发效率、更友好的开发体验,同时完全兼容及复用Java强大的生态圈

作为一名Java工程师,笔者在浅尝Kotlin之后,不由惊叹:这真是一门为Java程序员量身定做的语言!

Kotlin的很多小细节,恰恰是针对Java的痛点,也可见Kotlin语言的设计者(大名鼎鼎的JetBrain)真是很懂Java!

举几个栗子吧

栗子1:关于「Null Safety」

空指针的发明被称为The Billion Dollar Mistake

空指针相信也是广大Java程序员挥之不去的噩梦(甩之不去的牛皮癣),代码中极大量的if (xxx != null)实在是令人揪心,一不小心就出现NPE

但是在Kotlin中这个问题得到了很大的改善:在Kotlin中严格区分了一个变量是否可以为null,默认情况下一个变量是非null的

如下代码会直接在编译时报错

var a: String = "abc"
a = null // compilation error

一个后缀「?」的变量才可以置为null

var b: String? = "abc"
b = null // ok

通过这套设定,编译阶段就可以发现NPE,反过来讲,程序员可以放心大胆使用那些非null变量了,极大减少了编程过程中的心智消耗

在此基础上,使用「?.」符号进行链式调用,不仅仅是减少心智负担、而且极大减少代码量

「?.」运算符表示如果一个对象是null,则表达式直接返回null,不是null,则执行运算

看一下这个栗子

var theName = bob?.department?.head?.name

可以想见,如果使用Java,为了安全地得到theName,必然要连续使用!= null判断式,使得代码冗余且丑陋

栗子2:关于「Checked Exceptions」

Checked Or Unchecked, it’s a question

是否使用受检异常,是另一个困扰Java程序员的大问题

使用受检异常,给人一种放心的感觉,异常可以被强制catch住,并进行处理,而且,虽然是一个不好的编程习惯,但是仍然有大量的同学使用受检异常作为传递业务逻辑的手段;反过来讲「Unchecked Exception」,一旦触发,就一剑封喉,使得程序崩掉,似乎令人很不放心

但是我们希望代码简洁、希望减少灰色地带,而受检异常毫无疑问会带来冗余的代码,如下所示,我们不得不catch住IOException,否则编译失败;更令人尴尬的是,程序员必须同时保证catch块本身绝对安全,否则继续往上抛出异常

try {
  log.append(message)
}
catch (IOException e) {
  // Must be safe
}

在笔者看来,受检异常正如鸡肋,食之无味、弃之可惜,而且网上关于如何使用Java异常的文章、讨论铺天盖地,各路英雄各说各话,令人眼花缭乱

这次,Kotlin的语言设计者帮我们做了决定

Kotlin does not have checked exceptions

于是,世界都安静了

栗子3:data class

Kotlin提供了许多贴心的语法糖,例如:data class,可以大幅简化在Java工程中随处可见的DO / VO / DTO / model对象的编码

如下所示,使用data前缀类定义以后,只需一行代码,一个data类定义就OK了,自带各种getter / setter

data class User(val name: String, val age: Int)

代码行数越少,心智负担越小,Bug滋生概率更低

如果使用Java,想必会是这样的

public class User {
    
    private String name;
    
    private int age;

    // getter for name
    
    // setter for name
    
    // getter for age
    
    // setter for age

}
栗子4:完美兼容Java原有生态

有人说2015年是微服务年,也有人说2016年是微服务年,反正微服务最近很火:)

在Java社区,对于微服务的解决方案,毫无疑问就是Spring Boot

Spring Boot从框架层面简化应用开发,Kotlin则从语言层面简化代码编写,两者可以说是一对天作之合,嘿嘿

Github上有一个Spring Boot + Gradle + Kotlin的示例项目:https://github.com/sdeleuze/spring-boot-kotlin-demo

而Spring Boot官方也支持在线自动生成Kotlin工程:https://start.spring.io/#!language=kotlin

其他栗子:

Kotlin的特性还有不少,这里就不一一展开了:

  • 更好的类型推断
  • 原生支持不可变量
  • 函数式编程
  • 字符串模板
  • etc

简评Kotlin

Kotlin是一门简约而不简单、强大而又灵巧的JVM语言,恰如Java的一面镜子,学习Kotlin的过程中,也在不断反思Java的种种优缺,值得每一个Java程序员have a try

学习资料

  • Kotlin 1.0 release blog:http://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/
  • 与Java对比:https://kotlinlang.org/docs/reference/comparison-to-java.html
  • 使用Kotlin开发Spring Boot:https://spring.io/blog/2016/02/15/developing-spring-boot-applications-with-kotlin
  • 官方课程(1小时即可学完):http://try.kotlinlang.org
  • 官方文档:https://kotlinlang.org/docs/reference/

How to try

  • IDEA从15开始原生支持Kotlin
  • 使用Eclipse插件
  • 在线学习:http://try.kotlinlang.org

One thought on “小荷已露尖尖角,西北射天狼 – 新一代JVM语言Kotlin简介”

发表评论

电子邮件地址不会被公开。 必填项已用*标注