微服务开发系列:为什么选择 kotlin

源码地址

项目中采用的开发语言是 kotlin 。

开发人员可以根据自己需要采用 java 语言开发,但是很明显的,项目中各种工具类已经为了 kotlin 做出了很多修改,如果大量采用 java 开发, 结果可能是比纯 java 开发的速度还要慢。

至于为什么要坚持采用 kotlin 开发,之前我有发表过一些文章来描述 kotlin 好用的地方,但还是在使用过程中总会时不时的被 kotlin 惊艳一下。

kotlin 除了完全兼容 java 之外,还能够在架构中发挥不少优势,除了下面描述的地方,后面的介绍也会涉及。

极少的代码量

kotlin 将 java8 中的 stream 一系列的操作,都通过扩展特性,做了极大的简化。

例如 list 转 map users.associate { it.name to it},就省略了大堆繁琐的代码。

编写代码过程中的智能推断变量类型,能够帮助你避免反复的推断类型,从而把自己绕晕。

对于传入匿名函数,能够避免手动创建函数对象。

对于空指针的 “?” 操作,能够极大简化对于空变量的判断处理。

等等,诸如此类的操作,如果能够完全掌握,就能够减少数倍的代码量,学习过概率学的应该明白,更少的动作达到相同的目的,自然发生问题的概率更小

设计利器

减少代码量并不是 kotlin 的终点。

如果一个框架完全由 kotlin 搭建,只利用其特性来催促个别开发者写出更好的业务代码就太浪费了。

kotlin 还能够帮助你补全框架设计中的一些遗憾。

异常抛出

以框架设计中必不可少的业务异常抛出为例。

if (user.id.isNullOrEmpty()) {
    throw SomeException("user id cannot be empty")
}

这样的代码数不胜数,然而利用简单的扩展特性,就能够以新颖并且合理的方式抛出异常。

fun Boolean.ifSome(message: String?) = throw SomeException(message)

user.id.isNullOrEmpty().Boolean.ifSome("user id cannot be empty")

这样除非在特殊情况下,否则框架中的任何地方都使用这种方式来抛出异常,即节省代码,又拥有更高的可读性。

这种方式目前 java 有一种工具manifold中的扩展功能也能够一定程度上实现这种方法。

更方便的 json 开发

在框架中封装了 jackson 的使用。

之前的版本,如果想要把 java 对象转换成 jackson 对象,都需要像这样:

val json = Jackson.toJavaObject(user)

于是在运用了扩展之后,创造出了更加好用的转换逻辑。

fun Any.toObject() = Jackson.convertObject(this)
fun Any.toArray() = Jackson.convertArray(this)
fun Any.jsonString() = Jackson.objectToString(this)
inline fun  Any.convert() = Jackson.convert(this, object : TypeReference() {})

在以后的使用中,任何对象自身都可以在 json 和 javaObject 之间自由的转换,这更加符合人们的思考逻辑。

kotlin 是否值得信赖?

有一些人对 kotlin 这个语言是否稳定有疑虑。

实际上这一点完全不需要考虑。

一款开发语言能够被发布出来,已经说明了一切。

你可能会说,kotlin 在一些极端的情况下,可能会有意料之外的表现,毕竟 koltin 是先编译成 java,因此在复杂的情况下,会出现一些问题。

对此我想说,没有一款语言能够避免这一种情况,对编译器有一定了解的人,能够针对编译器的编译方式,做写一些匪夷所思的让编译器出错的程序。

就连 java 本身也有一些 bug,你应该在网上遇到过很多关于 jvm bug 的分析。

虽然这种问题在正常的开发流程中可能会出现,但是是 kotlin 的原因吗?

很明显不是,因为没有语言能避免,甚至有些不合理的地方都不能称之为 bug,而是特性。

许多人对 jvm 本身都谈不上了解的有多深入,更加没有去怀疑 kotlin 的理由。

本文参与了思否技术征文,欢迎正在阅读的你也加入。

你可能感兴趣的:(微服务开发系列:为什么选择 kotlin)