【用 Kotlin 写 Android】有这个必要吗?
前言
Kotlin 被 Android 选为官方支持并推荐的语言满一年了,这一年中可以看见的是 Google 正在大力推广 Kotlin,并且相关的 Kotlin 支持库也频繁更新,可以预见的是在未来一段时间内,Kotlin 会被越来越多的提及,并且也会被越来越多的采用,那作为一个互联网从业者——一日不学习就会被淘汰的的行业的从业者,那么是否 Android 开发就应该立刻去采用 Kotlin 开发呢?答案是不一定,要视情况而定,但可以确定的是,现在是要深入去研究 Kotlin 的时间了,至于原因,下面会仔细分析。本系列文章,就是深入分析 Kotlin 的教程系列,欢迎在后台留言交流。下面我们将开始我们的学习之旅,希望你不会中途放弃!
【用 Kotlin 写 Android】有这个必要吗?
答案是不一定。
为什么呢?我们先回答一个问题:我们现在的现有的项目是否都应该改用 Kotlin 去写?新项目和老项目选择起来有区别吗?我的答案是:
- 老项目不是必要的;
- 新项目如果有大量代码复用以前的代码而不是以依赖的方式引入的话,可以引入 Kotlin,但是不建议这样干;
- 而对于新项目,且对于可预见的一段时间内,维护这个项目的人都能比较好的采用 Kotlin 来维护的话,这个项目就建议采用 Kotlin 来写。
为什么会有这样的结论?这个听我慢慢解释。
首先,如果这个项目是一个比较久一点的项目,以前采用了的是原生 Java 来写的话,经过了这个长时间的维护演变我相信很大的可能这个项目经过很多个人修改,业务逻辑也很复杂了,很可能维护起来都没有那么简单了,理清里面的逻辑都没有那么简单了,更别说将其转换成 Kotlin 来写了,如果用 Android Studio 中自带的转换工具去转换,很大的可能是转换后,有几十几百的文件需要修改,空指针的判定都需要重新检查一遍,否则编译都很难通过,何况由于 Java 和 Kotlin 语法糖不一致,和可能在转换后同等替换的代码都可能无法按预期执行,常见的重载前后都有可能调用不同的方法(这个在后面的文章会有解析)。更不要说其中最难理解的业务逻辑了,如果真的转换了,那真的是噩梦一场,会非常痛苦!对于含有复制业务逻辑的代码,如果不想一周不眠不休的加班,那就不要这样干。同时在多人维护的项目中,贸然转换,很难去保证以前 Java 代码写的很好的人 Kotlin 也能写的很好,何况有些人还不打算转用 Kotlin,谁能保证转了之后不会引发血案呢?
其次是新项目复用很多老项目的代码,要不要引入 Kotlin?如果你问这样的问题,我猜测你所在的公司是一些规模不是很大的公司,同时开发多个 APP,而你又恰好是这些开发中比较有影响力或者说是中坚力量的那一个人,你会考虑这个问题,如果考虑实际情况,其实有可能是可以引入 Kotlin 的,但是还是上面讨论的问题,引入那些老代码,不可预知会与现在的 Kotlin 代码之间会出现什么问题?上面说的问题都还是存在的,不过因为这是一个新项目,因此老代码的引入是一步一步进行的,新写的代码采用 Kotlin,老代码在引入的过程中,是可以逐步转换成 Kotlin 的,或者即使不转换成 Kotlin,两种代码共存,风险也是可控的,这个过程中,会有一定阵痛期,可以根据实际情况,看团队素质进行决定,如果没有特别的理由转换成 Kotlin,采用原来的代码是一个不错的选择,也是我认为最好的选择,毕竟,这样的话,招人也会好招一点。
最后是一个全新或接近全新的项目,要不要用 Kotlin,我的答案是如果可能,尽量用 Kotlin。为什么呀?我觉得有几点原因吧:
- 不管你喜不喜欢,未来很大可能是 Kotlin 代替 Java,Google 已经决定要这么干了,Android 还是他的亲儿子,那以后 Android 对 Kotlin 的支持会越来越好,你不那么干,只会自讨苦吃,如果没有足够的实力,不要与他作对!
- Kotlin 确实有很多优秀的特性,没有 Java 语言的历史包袱,包含了很多优秀的编程思想,尤其是 Kotlin 的 函数式编程 的思想,确实让开发更开心了很多。
- 减少了一些本来就没有那么多必要的模板代码,空指针判断,提高开发效率,这也是最重要的一点。
- 很多语法糖更接近自然语言。记得我学习编程的时候,最开始学习伪代码,然后脱离伪代码去写 Java,Kotlin 在很多方面比 Java 更接近伪代码,更接近人类自然语言,这是巨大的进步。
- 宇宙第一 IDE 公司 IDEA 开发的 Kotlin,未来写 Kotlin 代码会比 Java 更爽。
- Jake Wharton 加入 Google Kotlin 团队。这也许不应该算是一个理由,但不得不承认那些 Android 领域最聪明的大脑都在为 Kotlin 发展贡献着力量,就算是为了学习,为了接近他们,我们也没有理由不去学习 Kotlin。
说了这么多,是时候要回归主题了,用 Kotlin 写 Android 有没有必要?答案是不一定,需要具体去根据项目情况去决定。但可以确定的是学习 Kotlin 是有必要的,想继续从事 Android 开发,Kotlin 必须要学。
Kotlin 要学习到什么程度呢?Kotlin 官网上说,如果你以前用 Java 开发 Android,你可以很容易的使用 Kotlin 开发,我觉得这说的没问题。但是如果说想用好 Kotlin,那这个问题就没那么简单了,他是思维方式的变化,Kotlin 建议采用函数式编程,这与 Java 的面相对象编程有很大的不同。我看过的最经典例子是:第一次学习 Java 就想刚开始学习开车,感觉别人很容易,但真正自己去开车的时候就发现没有那么简单了,你需要一点一点的补充自己的知识,从刚开始只可以在村子里开一开,到拿到驾照可以去任何你想开车去的地方,这经历了刻苦的练习。Java 版本的升级,就相当于有一天你的车开的太久了,你买了一辆新车,你可能一开始不是很熟悉,但是当你坐上车,简单检查了一下转向灯,喇叭在什么位置如何去使用后,你就可以直接开走了,因为很可能在开始的时候你不需要那些新知识就可以把车开回家,播放音乐的功能以后你可以慢慢去了解。但是如果你使用 Kotlin 可就不是换车那么简单了,而是说你现在要去开飞机了!啊,飞机,这就麻烦了,你都不知道飞机的倒挡在哪里,怎么办呀?但是当你理解了飞机在天上不可能倒着飞的时候,你就知道倒挡其实对飞机飞行是没有帮助的。这就是两种思维方式的变化。这个例子来自于:So You Want to be a Functional Programmer (Part 1),飞机可以在陆地上其实是可以倒着走的锅我不背。
说了这么多,最后翻译一下 Kotlin 官网上说的 Kotlin 相比较 Java 开发的优势吧:
- 兼容性好:Kotlin 由 Java 6 编译,老手机上也可以很好的运行。
- 性能好:Kotlin 和 Java 都是运行在 JVM 上,都会被编译成字节码,因此有同样好的运行速度。同时由于支持内联函数、lambdas,有些时候运行起来比用 Java 写的代码更快。
- 互操作性:与 Java 100% 兼容,可以互相调用,以前的库可以使用。(这种话不能信,有些情况有些坑,需要程序猿保证,本系列之后的文章会介绍常见的一些坑)
- 体积:很小的运行兼容库,可以使用混淆 ProGuard,在应用中只增加了几百个函数,少于 100k 的大小(这是官方数据,代表真实情况,毕竟你可能还会引入一些 Kotlin 相关的其他优秀的库,比如 Anko)
- 编译时间:编译的时候会有额外的清理时间,不过增量编译往往和 Java 差不多甚至好于 Java
- 学习曲线:没什么难度,有相关插件,几行代码可以搞定(Android Studio 默认创建项目时可以直接选择支持 Kotlin,但是如果想用好 Kotlin,还是需要仔细学习的,所有语言都一样,想用好 Java 也没那么容易)
总结
前面啰嗦的话说完了,总结起来就是不管你用不用,是时候该开始学习 Kotlin 了,【用 Kotlin 写 Android】系列也正式开启。PS:我也需要更多的准备才能写好这个系列,一起加油!!
Are You Ready? Go!
参考链接:
函数编程开发者:https://goo.gl/57JgyE
如果有一天你觉得过的舒服了,你就要小心了!
欢迎关注我的公众号:我是任玉琢
