Kotlin介绍

What

官网
Kotlin由JetBrains负责维护, 在2011年宣布发布, 2012年正式发布第一个版本, 2016年发布1.0版本. 目前最新的版本是1.1.
而JetBrains是IntelliJ IDE的开发商, Android Studio是基于IntelliJ的, 可以说Kotlin就是亲儿子, 有绝对好的IDE支持.

Why

趋势

  1. Google 宣布官方支持 Kotlin, Android Announces Support for Kotlin
  2. Android Studio 3.0会内置Kotlin, 在项目中使用Kotlin会非常方便, 而且可以预见未来会有越来越多的支持.
  3. 社区, 从1.0到现在, Kotlin已经形成了社区, 虽然仍比不上Java, 但是已经有非常多的资源, 现在更是有了Google的支持, 发展的势头只会越来越猛.
  4. 企业, 已经有Expedia, Flipboard, Pinterest, Square等公司在企业级应用中使用了Kotlin, Kotlin for Android Case Studies中提到3个例子, 有大公司的带头踩坑, 相信能够证明Kotlin可以胜任实际生产的使用.

完美兼容Java

完美兼容的意思是我们可以将Java代码和Kotlin代码混合在一起.

这意味着在Kotlin表现不好的地方, 我们可以保留Java的代码, 在项目中只使用团队认为合适的特性.

同样, 这意味着我们可以局部接入Kotlin而不是一次性把整个项目改头换面.

简洁

Kotlin有非常多的语法糖, 可能有些好用, 有些太过简洁, 但是不可否认, 使用Kotlin可以减少非常多的代码量, 能够提升日常开发的效率, 尽管Java有各种各样的IDE插件支持也能实现自动生成代码, 但是一个文件越少内容阅读起来越容易理解不是吗?

功能

虽然Java能够通过插件来避免手动输入代码, 不过有些功能则是Kotlin有而Java没有的.
不是说所有这些新功能都很好, 但是合理使用这些功能特性确实可以简化代码结构和更加方便地实现某些特定需求.

How

资源

官方使用Kotlin开发Android的说明文档
中文版Kolton文档
Kotlin在线编辑器学习
官方书籍: Kotlin In Action, github上正在更新的翻译项目

最吸引的特性

从写代码的角度看, Kotlin比Java好在哪?

永别NPE(NullPointerException)

null类型在Java中被吐槽了很多年了, 空指针错误也是项目中常见的造成崩溃的异常, Android中一般会使用注解库的@Nullable@NonNull来辅助检查, 不过这依赖于开发者的自觉性, 而这通常很不可靠.

在Kotlin中在语法上区分空和非空
在Java的一个普通方法里面我们要做非空检查, 例如

@Override
public void showMovie(Movie movie) {
    if(movie != null) {
        mTextView.setText(movie.name);
    }
}

而在Kotlin中

// Movie不可能为null
override fun showMovie(movie: Movie) {
    mTextView.setText(movie.name)
}
// Movie可能为null
override fun showMovie(movie: Movie?) {
    mTextView.setText(movie?.name)
}

在第一情况里面, Movie不可能为空, 如果调用时传空值, 会发生编译错误.
在第二种情况里面, 只要添加?就可以传空值, 但是同样不用进行空值判断, 因为movie?.name在空值的情况下是不会执行.

实际的好处

  1. 省略了非常多的非空判断
  2. 从根源上防止了NPE的发生

类型检查和转换

在列表的Adapter里面经常有下面的代码

@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
    if(holder instanceof AHolder) {
       ((AHolder)holder).textView.setText(null);
       ((AHolder)holder).imageView.setSelected(true);
    }
}

为什么已经有了instanceof判断后, 还需要强制转换呢?

连续的强制类型转换会让代码非常长, 进而影响阅读性.
在Koltin中只要

if(holder is AHolder) {
    holder.textView.setText(null);
    holder.imageView.setSelected(true);
}

编译器会自动帮我们进行转换, 这只是其中一个例子, 在很多地方都可以省略强制类型转换, 使得代码更简介.

命名参数和默认参数

在需要输入大量参数的时候我们一般使用Builder和链式调用, 例如:

new Request.Builder()
  .setDomainName("baidu.com")
  .setSecondDomainName("tieba")
  .setApi("path")
  .setFixed(true)
  .setIsHttps(false);

当要输入的参数太多, 不可能使用构造函数, 因为不能确定哪些是用户想自定义的, 使用Kotlin则只需要定义一个构造函数包含所有参数, 例如

constructor(port: Int = 8080,
             api: String? = null,
             secondDomainName: String? = null,
             domainName: String? = null,
             isHttps: Boolean = false,
             isFixed: Boolean = false) {
     // 省略赋值
}

// 只赋值部分参数
Request(api = "path", isFixed = true)

不再需要建造者模式, 不再需要链式调用的代码, 同时命名参数指明了参数含义, 代码的可读性没有受到影响.

扩展函数

在我们的代码中经常需要增加工具类来对某些类进行封装方便使用, 例如获取颜色的代码

public static getColor(Context context, int resId) {
    return context.getResources().getColor(resId);
}

在Kotlin我们可以选择扩展Int类型, 而不需要另外建一个工具类

fun Int.toColor(context : Context) : Int = context.resources.getColor(this)
// 调用
R.color.ct_02.toColor(context)

这里的例子可能不是很合适, 但是合理使用扩展函数可以

  1. 大量减少工具类,
  2. 让具体的项目可以自行扩展公共的基础库的类, 这样当基础库不能满足项目需要时, 不需要再新建一个名字类似功能类似的新类.

数据对象

项目中会包含非常多的Json映射类, 大量的getter/setter, toString方法, 现在Kotlin只需要一个data关键字就能满足几个IDE插件做的事.

  1. equals()/hashCode() 函数
  2. toString()函数
  3. copy()函数

lambda和函数类型

这两个特性应该不需要举例了, 再也不需要在View#setOnClickedListener的时候创建监听, 可以大幅减少代码的行数.

函数类型可以减少不必要的接口定义.

其他

  1. when语法取代switch, 再也不用担心漏掉break
  2. []可以同时在数组和列表中使用
  3. in表示范围, 不再需要a > 0 && a < 10, 只要a in 0..10

这里只是一篇小小的总结文章, 还有更多我不熟悉和还没发掘到特性等待你去尝试.
当然, Kotlin也肯定有他不好的地方, 或者有人觉得太过简洁反而不好, 有人觉得Kotlin还太年轻可能到处是坑, 也需要一段时间的学习和适应, 阵痛是肯定会有的, 但是身为程序猿不就是应该为了追求更好更高效率而去踩坑么, 现在有更好的放在你面前, 为什么不试试呢? 毕竟老大们都上了 :D

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容