技术小黑屋
Navigate…» 首页» 干货铺子» 存档» 读书» 关于» 合作» 捐赠» 订阅» 好基友» 内推» 福利» 友链为什么我要改用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的重要原因。
语法简单,不啰嗦
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
- Kotlin支持类型推断,没有Java那样的啰嗦。
- 另外用
var表示变量,val表示常量更加的简洁 - 方法也很简单,连function都缩写成了fun,平添了几分双关之意。
- 类的继承和实现很简单,使用:即可
- Kotlin每个句子都不需要加分号(;)
空指针安全
空指针(NullPointerException或NPE)是我们使用Java开发程序中最常见的崩溃了。因为在Java中我们不得不写很多防御性的代码,比如这样
1 2 3 4 5 6 7 8 |
|
在Kotlin中空指针异常得到了很好的解决。
- 在类型上的处理,即在类型后面加上?,即表示这个变量或参数以及返回值可以为null,否则不允许为变量参数赋值为null或者返回null
- 对于一个可能是null的变量或者参数,在调用对象方法或者属性之前,需要加上?,否则编译无法通过。
如下面的代码就是Kotlin实现空指针安全的一个例子,而且相对Java实现而言,简直是一行代码搞定的。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
关于空指针安全的原理,可以参考这篇文章研究学习Kotlin的一些方法
支持方法扩展
很多时候,Framework提供给我们的API往往都时比较原子的,调用时需要我们进行组合处理,因为就会产生了一些Util类,一个简单的例子,我们想要更快捷的展示Toast信息,在Java中我们可以这样做。
1 2 3 |
|
但是Kotlin的实现却让人惊奇,我们只需要重写扩展方法就可以了,比如这个longToast方法扩展到所有的Context对象中,如果不去追根溯源,可能无法区分是Framework提供的还是自行扩展的。
1 2 3 4 |
|
注意:Kotlin的方法扩展并不是真正修改了对应的类文件,而是在编译器和IDE方面做得处理。使我们看起来像是扩展了方法。
Lambda, 高阶函数,Streams API, 函数式编程支持
所谓的Lambda表达式是匿名函数,这使得我们的代码会更加的简单。比如下面的代码就是lambda的应用。
1 2 3 |
|
所谓的高阶函数就是
- 可以接受函数作为参数
- 也可以返回函数作为结果
举一个接受函数作为参数的例子。在Android开发中,我们经常使用SharedPreference来存储数据,如果忘记调用apply或者commit则数据修改不能应用。利用Kotlin中的高阶函数的功能,我们能更好的解决这个问题
1 2 3 4 5 6 7 8 9 10 |
|
当然这上面的例子中我们也同时使用了方法扩展这个特性。
Kotlin支持了Streams API和方法引用,这样函数式编程更加方便。比如下面的代码就是我们结合Jsoup,来抓取某个proxy网站的数据,代码更加简单,实现起来也快速。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
字符串模板
无论是Java还是Android开发,我们都会用到字符串拼接,比如进行日志输出等等。在Kotlin中,字符串模板是支持的,我们可以很轻松的完成一个字符串数组的组成
1 2 3 |
|
注意:关于字符串拼接可以参考这篇文章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实现起来要快很多。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
关于性能
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”,这样一个高效实用的语言应该会被越来越多的团队所接受,并应用到开发生产中。当然也希望在国内环境下大放异彩。
我的知乎 Live 推荐
猜你喜欢:
- 说说依赖注入
- 我的2016年总结
- 树莓派入手指南
- 精选优质文章列表
- 程序员必读的六本书
- Java程序员必读的9本书
- Android签名相关知识整理
- 深入剖析 Android中的 ArrayMap
- Java中的静态绑定和动态绑定
- 个人博客访问加速百倍的方案
- 士别三年,我的最新个人作品
- 关于Android中工作者线程的思考
- 注意:在为Android程序申请权限时
- Android中WebView拦截替换网络请求数据
读书推荐
特别推荐
最新文章
- 为什么我要改用Kotlin
- 一个简单实用的Android调试应用技巧
- 研究学习Kotlin的一些方法
- 一些关于加速Gradle构建的个人经验
- Error-prone,Google出品的Java和Android Bug分析利器
- 控制RecyclerView Item的宽度
- Android中一个简单有用的发现性能问题的方法
- Java性能调优之容器扩容问题
- 一个关于安卓打包提速的小改进
- 深入剖析 Android中的 ArrayMap
- 关于 Android 应用多进程的整理
- 一个事半功倍的Java反射库
- 为什么程序员应该要尝试写一写博客
- 我的2016年总结
- 关于对象池的一些分析
Blogrolls
- 技术小黑屋血拼
- 通勤读书神器Kindle
- XBrowser-极简快速的浏览器
- Digital Ocean VPS:注册赠送10刀
- Vultr VPS, 注册赠送20刀,节点丰富
- Github程序员,极客IT男女秋冬装连帽卫衣外套
- 超强路由器 网件NETGEAR WIFI双频千兆无线路由器 中继 OPENWRT多拨
好书推荐
- 米
- 看见
- 断舍离
- 小王子
- 暗时间
- 浪潮之巅
- 坂本龙马
- 硅谷之谜
- 数学之美
- 天朝的崩溃
- 煮酒探西游
- 翻译的技巧
- 硅谷百年史
- 丑陋的中国人
- 疯狂的程序员
- 罗马人的故事
- 帝王师:刘伯温
- 如何阅读一本书
- 把时间当作朋友
- 被误解的日本人
- 第三帝国的兴亡
- 人类简史:从动物到上帝
- 乌合之众:大众心理研究
- 你一定爱读的极简欧洲史
- 启示录:打造用户喜爱的产品
- 沃顿商学院最受欢迎的成功课
- 失控:全人类的最终命运和结局
- 中国人史纲,柏杨先生狱中著作
- 三体,亚洲首部雨果奖获奖作品
- 这个历史挺靠谱:袁腾飞讲世界史
- 创业维艰:如何完成比难更难的事
- 不要让未来的你,讨厌现在的自己
- 动物农场,不简单的政治童话寓言
- 现代“日本学”开山之源,菊与刀
- 人可以被毁灭,但不能被打败:褚时健传
- 番茄工作法图解:简单易行的时间管理方法
- 戒了吧!拖延症:写给年轻人的拖延心理学
- 极客物理学 : 地球上最有趣的问题和最出人意料的答案
编程好书
- 算法
- 代码大全
- 代码之髓
- 人月神话
- 编程珠玑
- 编程之美
- 啊哈!算法
- 黑客与画家
- Unix编程艺术
- HTTP权威指南
- 代码整洁之道
- 程序员的呐喊
- 有趣的二进制
- 程序员修炼之道
- 鸟哥的linux私房菜
- 松本行弘的程序世界
- 数据结构与算法分析
- 深入理解计算机系统
- Gradle for Android 中文版
- 高效程序员的45个习惯
- 计算机是怎样跑起来的
- 计算机程序的构造和解释
- 重构:改善既有代码的设计
- 敏捷软件开发(原则模式与实践)
- 设计模式 可复用面向对象软件的基础
- 程序员的思维修炼:开发认知潜能的九堂课
- 编码:隐匿在计算机软硬件背后的语言(永不退色的计算机科学经典著作)
Java经典
- Effective Java
- Java编程思想
- Java并发编程实战
- Java核心技术卷一
- Java核心技术卷二
- 深入理解Java虚拟机
- Java程序员修炼之道
- Java性能优化权威指南
- Java虚拟机规范(Java SE 7版)
Android推荐书籍
- Android群英传
- 深入理解 Android
- Android开发艺术探索
- Android应用性能优化
- Android游戏开发详解
- Android 安全架构深究
- Gradle For Android 中文版
- Android 软件安全与逆向分析
- Android开发进阶:从小工到专家
- Android源码设计模式解析与实战
人气文章
- 说说Android中的ANR
- Android扫描多媒体文件剖析
- JVM运行时的数据区
- 为什么程序员应该尝试写一写博客
- 一个简单实用的Android调试应用技巧
- Android中使用ViewStub提高布局性能
- Android中WebView拦截替换网络请求数据
- 一个Android代码JIT友好度检测工具
- Java中的字符串常量池
- Android中如何检测当前线程为主线程
- 注意:在为Android程序申请权限时
- Java程序员必读的9本书
- 程序员的逗比瞬间(第一季)
- ”失效”的private修饰符
- 研究学习Kotlin的一些方法
- Android代码规范利器: Checkstyle
- Google Play商店推广那些事
- 程序员的逗比瞬间 最终番
- 使用Android lint发现并解决高版本API问题
- 一个关于安卓打包提速的小改进
- 一个简易小工具,七牛Uploader for Octopress
- Java细节:字符串的拼接
- 你造么,Android中程序的停止状态
- Android中Java和JavaScript交互最详细的文章
- Java永久代去哪儿了
扫一扫关注小黑屋公众号(droidyue_com)
Copyright © 2017 - androidyue - Powered by Octopress 云存储提供方: