Android 开发者自述:为什么我要改用 Kotlin?
两味真火 2017年05月19日

Android 开发者自述:为什么我要改用 Kotlin?

两味真火 两味真火 发布于2017年05月19日 收藏 82 评论 98

【投票有礼】玩转 Linux,哪些技能会是您的必备之选?>>>  

编者注:Google I/O 2017 首日 Keynote 刚刚落幕,其中 Google 宣布 Android 系统将对 Kotlin 提供 first-class 的支持算是一个非常重磅的新闻。对于大众来说,Kotlin 编程语言可能是相对陌生的,它究竟有何过人之处呢?不如让我们听听开发者是怎么说的。

写在前面的话,作为一个不熬夜的人,一觉醒来发现 Kotlin 成为了 Android 的官方语言,可谓是大喜过望。为了趁热打铁,我决定提前三天放出原定本周日 Release 的文章。希望能及时让大家了解一下 Kotlin。

相信很多开发人员,尤其是 Android 开发者都会或多或少听说过 Kotlin,当然如果没有听过或者不熟悉也没有关系。因为本篇文章以及博客后期的内容会涉及到很多关于 Kotlin 的知识分享。

在写这篇文章前的一个多月,Flipboard 中国的 Android 项目确定了正式将 Kotlin 作为项目开发语言,这就意味着新增的代码文件将以 Kotlin 代码格式出现,而且同时旧的 Java 代码也将会陆陆续续翻译成 Kotlin 代码。在使用 Kotlin 的这段时间,被它的简洁,高效,快捷等等特点震撼,所以有必要写一篇文章来谈一谈 Kotlin 的特性,如若能取得推广 Kotlin 的效果则倍感欣慰。

Kotlin的「简历」

  • 来自于著名的 IDE IntelliJ IDEA(Android Studio 基于此开发) 软件开发公司 JetBrains(位于东欧捷克)

  • 起源来自 JetBrains 的圣彼得堡团队,名称取自圣彼得堡附近的一个小岛 (Kotlin Island)

  • 一种基于 JVM 的静态类型编程语言

来自知名的工具开发商 JetBrains,也就决定了 Kotlin 的基因中必然包含实用与高效等特征。那我们接下来看一看 Kotlin 的特点,当然这也是我改用 Kotlin 的重要原因。

语法简单,不啰嗦

  • Kotlin 支持类型推断,没有 Java 那样的啰嗦。

  • 另外用 var 表示变量,val 表示常量更加的简洁

  • 方法也很简单,连 function 都缩写成了 fun,平添了几分双关之意。

  • 类的继承和实现很简单,使用:即可

  • Kotlin 每个句子都不需要加分号 (;)

空指针安全

空指针(NullPointerException 或 NPE)是我们使用 Java 开发程序中最常见的崩溃了。因为在 Java 中我们不得不写很多防御性的代码,比如这样:

在 Kotlin 中空指针异常得到了很好的解决。

  • 在类型上的处理,即在类型后面加上?,即表示这个变量或参数以及返回值可以为 null,否则不允许为变量参数赋值为 null 或者返回 null

  • 对于一个可能是 null 的变量或者参数,在调用对象方法或者属性之前,需要加上?,否则编译无法通过。

如下面的代码就是 Kotlin 实现空指针安全的一个例子,而且相对 Java 实现而言,简直是一行代码搞定的。

关于空指针安全的原理,可以参考这篇文章研究学习Kotlin的一些方法

支持方法扩展

很多时候,Framework 提供给我们的 API 往往都时比较原子的,调用时需要我们进行组合处理,因为就会产生了一些 Util 类,一个简单的例子,我们想要更快捷的展示 Toast 信息,在 Java 中我们可以这样做。

但是 Kotlin 的实现却让人惊奇,我们只需要重写扩展方法就可以了,比如这个 longToast 方法扩展到所有的 Context 对象中,如果不去追根溯源,可能无法区分是 Framework 提供的还是自行扩展的。

注意:Kotlin 的方法扩展并不是真正修改了对应的类文件,而是在编译器和 IDE 方面做得处理。使我们看起来像是扩展了方法。

Lambda, 高阶函数,Streams API, 函数式编程支持

所谓的 Lambda 表达式是匿名函数,这使得我们的代码会更加的简单。比如下面的代码就是 lambda 的应用。

所谓的高阶函数就是:

  • 可以接受函数作为参数

  • 也可以返回函数作为结果

举一个接受函数作为参数的例子。在 Android 开发中,我们经常使用 SharedPreference 来存储数据,如果忘记调用 apply 或者 commit 则数据修改不能应用。利用 Kotlin 中的高阶函数的功能,我们能更好的解决这个问题:

当然这上面的例子中我们也同时使用了方法扩展这个特性。

Kotlin 支持了 Streams API 和方法引用,这样函数式编程更加方便。比如下面的代码就是我们结合 Jsoup,来抓取某个 proxy 网站的数据,代码更加简单,实现起来也快速。

字符串模板

无论是 Java 还是 Android 开发,我们都会用到字符串拼接,比如进行日志输出等等。在 Kotlin 中,字符串模板是支持的,我们可以很轻松的完成一个字符串数组的组成:

注意:关于字符串拼接可以参考这篇文章Java细节:字符串的拼接

与 Java 交互性好

Kotlin 和 Java 都属于基于 JVM 的编程语言。Kotlin 和 Java 的交互性很好,可以说是无缝连接。这表现在:

  • Kotlin 可以自由的引用 Java 的代码,反之亦然。

  • Kotlin 可以现有的全部的 Java 框架和库

  • Java 文件可以很轻松的借助 IntelliJ 的插件转成 kotlin

Kotlin 应用广泛

Kotlin 对 Android 应用开发支持广泛,诸多工具,比如 kotterknife(ButterKnife Kotlin 版),RxKotlin,Anko 等等,当然还有已经存在的很多 Java 的库都是可以使用的。

除此之外,Kotlin 也可以编译成 Javascript。最近使用 Kotlin 写了一段抓取 proxy 的代码,实现起来非常快捷。甚至比纯 JavaScript 实现起来要快很多。

关于性能

Kotlin 的执行效率和 Java 代码的执行效率理论上一致的。有时候 Kotlin 可能会显得高一些,比如 Kotlin 提供了方法的 inline 设置,可以设置某些高频方法进行 inline 操作,减少了运行时的进栈出栈和保存状态的开销。

读到这里,是不是想要尝试一下 Kotlin 呢,它简洁的语法,汇集诸多特性,高效率实现等等,已经在国外风生水起,国外的 Pintereset, Square, Flipboard 等公司已经开始应用到生产中。

关于转向 Kotlin

其实,我在做决定之前(当时 Kotlin 还没有被钦定)也曾有过考虑,是不是选择了 Kotlin 就意味着放弃 Java 呢,冷静下来想一想,其实并不是那么回事,因为 Kotlin 与 Java 语法太相近,以及在 Kotlin 中无时无刻不在和 Java 相关的东西打交道,所以这点顾虑不是问题的。

对于个人的项目来转向 Kotlin,通常不是很难的选择,毕竟 Kotlin 是那么优秀的语言,相信很多人还是愿意尝试并使用这个事半功倍的语言的。

而比较难抉择的情况是如果如何让团队转用 Kotlin,个人认为团队难以转用的原因有很多,比如学习成本,历史包袱等等。但其实根本原因还是思维方式的问题,歪果仁喜欢用工具来提升开发效率,因为人力成本很高。而国内团队提高效率的办法通常是增加成员。好在 Flipboard 美国团队自 2015 年(可能更早)就引入了 Kotlin,因此中国团队这边选用 Kotlin 也更加顺水推舟。当然更主要的是目前团队规模不大,成员一致认可 Kotlin 的优点。

关于团队转用 Kotlin 的方法,一般比较行得通的办法是自上而下的推行。这就意味着要么直接的技术负责人比较开明要么就是需要有人来不断推介来影响团队。

做个比较现实的比拟,Java 就像是一趟从我的家乡保定开往北京西的耗时将近 2 个小时甚至更长的普通列车,而 Kotlin 则是那趟仅需 40 分钟就能到达的高铁。通常的人都会选择高铁,因为它节省了时间和提高了体验。这个时间和体验对应编程中的,我想应该是高效率和高可读性,可维护性的代码。

现在好了,有了 Google 的支持,Kotlin 转 Android 相信在不久的将来就会全面展开。篡改 Python 的一句名言「人生苦短,我用 Kotlin」,这样一个高效实用的语言应该会被越来越多的团队所接受,并应用到开发生产中。当然也希望在国内环境下大放异彩。

本文原载于 droidyue.com(技术小黑屋),原标题为《为什么我要改用 Kotlin》。本文作者为 Flipboard 中国 Android 研发工程师段建华。开源中国已经获得转载授权。

>>>【全民狂欢,评论有礼】5月15日-31日评论每日更新的“新闻资讯和软件更新资讯”,评论点赞数超过 20 的可登上每周更新的“源资讯”和“软件周刊”两大栏目,点赞数超过 50 的还将获得 5 活跃积分奖励和开源中国定制好礼。详情

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:Android 开发者自述:为什么我要改用 Kotlin?
分享
评论(98)
精彩评论
37
按照以往的规律,我估计过段时间就会有,Android开发者自述:我为什么放弃kotlin
12
人生苦短,我用 Kotlin
11
等一个 《Android 开发者自述:为什么我要放弃 Kotlin?》
10

引用来自“鳄鱼的眼泪”的评论

除了一些语法糖,和java比没看到有啥优势,一看到支持全局函数就果断放弃了。
java里面也有很一些语法糖,才这么便利的
1 for循环 这个经常用吧
2 自动装箱拆箱
3 。。。数组
我觉得语法糖能显著减少代码量,提供便利,挺好的,不知道有些人,一提糖就觉得幼稚是什么意思
代码写的再啰嗦也不嫌弃?
10
... 为什么不用scala
最新评论
0
用Kotlin开发android平台语音识别,语义理解应用(olamisdk)
http://blog.csdn.net/ls0609/article/details/75084994
0
The son gave me this particular for the moms time. He understands im not around price tag still things originates from all heart. I can’t feel this has my personal favourite colors and also even matches the wrist. I by no means might notice bracelets to fit headphonesmy little wrist. Extremely happy to come with recieved this being a present.
faux van cleef necklace white http://www.lemeilleurbijoux.cn/en/new-van-cleef-arpels-jewelry-c3_85/
0
就一门语言,对于一个大项目来说,你说换就立马可以换??幼稚
0

引用来自“纯洁徐”的评论

... 为什么不用scala

引用来自“catalogMan”的评论

kotlin 比 scala 更像 java,这就是主要原因了;作为 2门语言都用过的人,我觉得kotlin更加好玩。

ps:现在是重度kotlin用户,从0.x版本一直追到现在的1.2版本

引用来自“cyper”的评论

scala太复杂, 有一句话kotlin只有scala 20%的feature但是现了scala 80%的功能.

kotlin计算1到100的和
val sum= (1..100).reduce{a,b->a+b};
println(sum); //打印出 5050

引用来自“SwhGo_oN”的评论

(1 to 100).sum

引用来自“cyper”的评论

kotlin也可以支持给任意类型增加extension (和swift一样)

//给内置的range类型增加sum方法
fun kotlin.ranges.IntRange.sum(): Int = this.reduce { a, b -> a + b }

//然后range直接可以使用sum了

(1..3).sum() // 打印1+2+3=6
(1..100).sum() // 打印1+..+100=5050
(1..100).toList().sum()
0
哇喔,语言也是后浪推前浪。
0
有比php和lua更简洁的语言吗,估计没有
0

引用来自“闲大赋”的评论

看到var和val就打算放弃, val语义完全不明确,而且容易看成1。

少些几个字母就一定简洁?

引用来自“墨名次”的评论

很明确, val就是定义常量的,跟swift的let一样。比java的final更严格。java声明一个常量list你仍然可以使用add()往里面装东西,而let或val不能,let或val也是经常用到的

引用来自“superduper”的评论

建议多看看 官方的教程和介绍。
难道val不是只读?
0
这语法怎么看都像是scala,不说我还以为是scala代码呢
0
安卓开发者自述:我为什么放弃kotlin
0

引用来自“闲大赋”的评论

看到var和val就打算放弃, val语义完全不明确,而且容易看成1。

少些几个字母就一定简洁?

引用来自“墨名次”的评论

很明确, val就是定义常量的,跟swift的let一样。比java的final更严格。java声明一个常量list你仍然可以使用add()往里面装东西,而let或val不能,let或val也是经常用到的
建议多看看 官方的教程和介绍。
0
支队kotlin-js感兴趣,其它的我愿意撸java 。。。。
0
看这种变量命名特别扭,哪里体现简洁了呢?Java里String message,而这货变量总是多出个冒号message : String弄得和苹果OC似的,本来可以写得更简单点,却自称风格清晰,写代码一堆。
0

引用来自“tuzhao”的评论

我就不明白了不为什么不要分号?
这都是习惯问题,用惯了分号的的人看着别扭;对初学的人没影响,用什么语言都一样。
0
被kotlin的简洁惊呆了,很好玩
0

引用来自“闲大赋”的评论

看到var和val就打算放弃, val语义完全不明确,而且容易看成1。

少些几个字母就一定简洁?

引用来自“乌龟壳”的评论

回复@闲大赋 : 可能作者是IDE高手有关,人一眼可能看错,但IDE不会,一高亮也仍然很清晰。就像模板引擎为什么要IDE插件?就是因为高亮不对看起来一坨一坨很难受
我就很喜欢val这玩意,简洁又不会丢类型。而且不可变。用在项目中可以提高代码可读性
0
为什么不抛弃jvm?编译才是王道
0
像typescript
0
我要说其实groovy不会比它差,跟java关系更紧密
0
kotlin支持反射, swift不支持..,,

>>> 1::class //查看1的类型
class kotlin.Int
>>> 1::class.java //查看1对应的java类型
int
>>> 1 is Int // is关键字替代掉java中的instanceof
true
>>> "Hello" is String
true

自已看官方文档吧. 反正我觉得比刚接触swift时更觉得simple / fun.
0

引用来自“纯洁徐”的评论

... 为什么不用scala

引用来自“catalogMan”的评论

kotlin 比 scala 更像 java,这就是主要原因了;作为 2门语言都用过的人,我觉得kotlin更加好玩。

ps:现在是重度kotlin用户,从0.x版本一直追到现在的1.2版本

引用来自“cyper”的评论

scala太复杂, 有一句话kotlin只有scala 20%的feature但是现了scala 80%的功能.

kotlin计算1到100的和
val sum= (1..100).reduce{a,b->a+b};
println(sum); //打印出 5050

引用来自“SwhGo_oN”的评论

(1 to 100).sum
kotlin也可以支持给任意类型增加extension (和swift一样)

//给内置的range类型增加sum方法
fun kotlin.ranges.IntRange.sum(): Int = this.reduce { a, b -> a + b }

//然后range直接可以使用sum了

(1..3).sum() // 打印1+2+3=6
(1..100).sum() // 打印1+..+100=5050

相关资讯

最新资讯
热门资讯
顶部