半年前我在一个两年历史的后端 Java 项目中,尝试着引入了 Kotlin,半年过去,证明了当时的尝试是值得的。分享一下我的感受。
优点
- 无缝引入到现有 Java 项目,只看了半天文档就上手了,并且没有因为两种语言混合开发带来副作用。
- 表达能力优于 Java,平均下来,在不影响可读性的情况下,大概可以比 Java 少写 1/3 的代码。
- 增加特性的同时,没有降低性能,部分 benchmark 中还有微弱的性能提升,马儿跑得更快还吃的更少。
- 适度的函数式编程支持,map-filter-fold 代替了一大堆 for-loop,简洁明了,代码中没有 map/list 构造工作干扰视线。
- extension function 可以很方便的给现有的类扩充新的方法,而不用定义新类型,最常用的就是 TypeA.toTypeB()。
- non-null 变量和 elvis 操作符,基本上消灭了 null 的烦恼,既不担心 NPE,又不用到处 if 判断是不是 null。
- unchecked exception,可以自己决定在调用栈的某一层 catch 和处理,不必到处 try-catch 好麻烦。
- val 和 var,在变量定义时决定它是否可以改变它的值,不能改变的值,是不用担心不小心覆盖的。
- property 语法,不用让 IDE 自动生成 getter/setter 了,也不用 Lombok 自动合成这些方法了。
- object,匿名对象信手拈来,并且编译器自动帮你搞成线程安全的 singleton。
- delegate,和用它实现的 lazy evaluation,你甚至可以自行决定 lazy 求值在并发时的同步方式。
- String Interpolation,"aaa$x"或者"aaa${x.y}"是不是很面熟?多行字符串也很方便。
- when/let/apply/also/takeIf 等等操作,可以实现非常简洁的操控,直接消除掉 builder 设计模式了。
- imutable 的 list/set/map,imutable 是个很好的约束工具,默认就该 imutable。
- REPL,就是类似 jshell 的那个东西,很方便,也很实用,比如直接命令行访问某个类。
缺点
- $符号用于 String Interpolation,当前版本的 IDEA 无法正确处理 Value 注解中转义过的$。
- spring-data 中 query builder 依赖的机制,目前不能方便的自动生成 Kotlin 的 Query Object。
- 资料还是偏少,不过官网的文档差不多也够了,毕竟大部分库和框架,都是沿用的 Java 的。
- IDEA 自动转换工具,把 Java 转换成 Kotlin,转换质量明显比我人肉转的要差的多。
目前项目中一共有 200 多个 Java/Kotlin 代码文件,2/3 已经是 Kotlin 的了,估计半年后 Kotlin only 了。
下半年准备尝试用 coroutine 改造一下现有的多线程架构,3000 个线程已经限制到某些产品上的玩法了,异步回调的话又不太适合调用栈很深并且各种分支和跳转的业务,kotlin 的协程,可以直接 wrap 现有的异步的库,设计思路上很赞,充分利用现有的库。
kotlinjs 虽然正式发布了,但是 runtime 太大,而且我已经用 coffeescript 了,就没有尝试。
kotlin native 目前继续观望,也许明年会在合适的地方尝试一下,这也是个比较有趣的东西。