使用Kotlin做开发一个月后的感想

本文由业松所写,转载请注明作者。

谈kotlin之前

有一类程序员,自己根本没体验过的东西,看了几篇哗众取宠的博文自己也来嘲讽,我称之为云程序员。就比如Kotlin,有人蹭热度写几篇类似“我为什么从kotlin又回到java”的博文,就把kotlin一通批判。有空看看这些蹭热度博文为啥不看看Android Developer官网所有示例代码都是kotlin版本在前,java版本在后呢?

争论语言、框架的优劣是没有意义的。很多程序员总是对自己一直使用的语言、框架大肆吹捧而对其他语言、框架各种贬低,很明显这样的程序员太狭隘了。Java确实常年排名第一,其他语言就没有意义了吗?当然不是,即使是批判,你也得自己真的体验过了才有资格。这可不是你行你上的翻版,毕竟了解一门新语言对一个真正程序员老说是很轻松的事。

简洁的语法

Kotlin给我的感觉就是它就是针对Java里所有的痛点来做改变的,比如语法繁琐,烦人的空指针,缺少函数式编程支持(Java8虽然支持Lambda表达式但还远远不够)等等。不像它的孪生兄弟Scala那样奔放,Kotlin给我的感受是聪明又克制,对Java程序员来说半天就足够上手开干了,不像Scala门槛那么高。

Java语言是我所接触过语言中语法最繁琐的(有更繁琐的请告知),这种繁琐在main函数就可以体现,而且Java可能也是唯一一个几乎没法不用IDE的语言。其他语言脱离了IDE的语法警告和代码生成模版也勉强能写一写,Java代码你没有试试看?

但是Java的语法之严谨和繁琐恰恰是Java如此流行的原因。没写过Java的人可能没法理解这句话。人们对于Java严苛的语法还不够满意,还要再加上check-style,findbugs以及各种XXX公司Java代码规范等各种条条框框,最终得到的结果是所有Java程序员写出来的代码都能互相看懂。即使是刚毕业不久的Java程序员,只要熟悉Java面向对象语法,几乎不存在看不懂其他Java代码的情况(业务看不懂除外)。这样保证了Java程序员的代码下限非常之高,能够保证大型项目的成功。

好像扯Java扯的有点多了。接触Kotlin之后会发现,kotlin在尽可能保持和Java一样的语法严苛性的情况下,大幅度地精简了Java代码,写起来非常之爽。

//快速创建一个Bean类
data class Person(val id: Long, var name: String, var age: Int)

fun main() {
    // 创建实例
    val zhangsan = Person(0L, "zhangsan", 23)
    // set/get方法
    zhangsan.age = 24
    val name = zhangsan.name
    
    //copy方法
    val lisi = zhangsan.copy(id = 1, name = "lisi")
    //默认生成的tostring和equals/hashcode方法,可重写
    zhangsan.toString()
    zhangsan.hashCode()
    var isEqual = zhangsan.equals(lisi)
}

简洁的语法无处不在,比如上面的Bean类如果用java来写至少要多好几倍的代码。单例模式只需要把class换成object即可。这些虽然用Java的IDE的各种模版生成工具一样可以秒生成,但是还是kotlin写起来更舒服一些。

我想强调的是,Kotlin并不是无脑地利用语法糖和新关键字来精简语法,我们可以很清晰地感受到Kotlin在设计过程中尽可能地保证它尽可能的语法严苛性。

空指针

Java的空指针异常被称之为“Billion Dollar Mistake”。在上家公司的时候为了避免空指针异常,代码规范要求几乎所有的对象都要进行判空操作,那种嵌套很深的json对象,判空起来真的是又臭又长。

val name: String?
//这里要吐槽下为啥kotlin没有三目运算符?
name = if(Random.nextBoolean()) "Ann" else null
//加上?则只在name不为null的时候会调用,得到的len1类型也是有问号的,即Int?
val len1 = name?.length
//这种写法是如果为空给一个默认值,得到的len2类型为Int,不带问号
val len2 = name?.length?:0
//加上双感叹号其实就是java什么都不加的写法了,如果为null会报空指针异常
val len3 = name!!.length

上面的代码解释了三种对可能为空的对象的处理。其实我把Kotlin对空指针的处理归类为给所有对象加了个范型——符号?,对于带?的对象则表明它可能为空,你不处理直接使用的话不让编译,也就是把空指针尽量扼杀在编译期间。这个想法真的是简单又巧妙。很多人一听Kotlin就说没有空指针了,但是没用过的话并不知道怎么实现的。现在再有面试官问你,知道怎么回答了吧?

函数式编程

fun AppCompatActivity.setupActionBar(@IdRes toolbarId: Int, action: ActionBar.() -> Unit) {
    val toolbar = findViewById<Toolbar>(toolbarId)
    setSupportActionBar(toolbar)
    supportActionBar?.run {
        //执行参数中的函数,这样用户在调用该方法的时候更加灵活
        action()
    }
    toolbar.setNavigationOnClickListener {
        Log.d("AppCompatActivity", "finish")
        finish()
    }
}

//------------------------分割线-----------------------------
//类似的单方法接口现在只需要写一个闭包就行了
binding.aliPayIcon.setOnClickListener {
    Log.d("example", it.contentDescription.toString())
}

//扩展函数let,只有在对象不为空的时候会调用,相当于做了判空
binding.let {
    it.setLifecycleOwner(this@WithdrawActivity)
    it.viewModel = vm
}

//扩展函数apply, 在闭包内可直接调用对象的方法属性,有个好处就是可以直接操作对象不需要先生成变量
vm.accountName.apply {
    this.value = "aaaa"
    Log.d("example", this.value?.toString() + ":" + this.hashCode())
}

//还有其他基础扩展函数run, with, also等等,可以看看这篇博客的介绍:https://www.jianshu.com/p/28ce69d58fea

函数式编程对很多Java程序员来说是很陌生的。尽管我不想黑,但是Java真的强到让很多Java程序员只会Java一门语言,并且基本上Java8以上的版本也没接触过。而除了Java(Java8以下)我还真不知道哪门语言不支持函数式编程。

几乎所有语言都支持函数式编程,因此会灵活使用函数式编程真的挺重要。Java不支持是因为函数式编程相对要难一点,不支持函数式编程反而让Java代码的下限更高。除了难度大一点,函数式编程最令人不爽的就是阅读性差(可能比较依赖写代码的人的水平),我看Java框架源码基本都很顺畅,但是看JavaScript框架简直懵逼。我现在的水平看Kotlin函数式代码也费劲,但是kotlin毕竟是强类型语言,函数的参数和返回值类型固定的话,认真读还是不难读懂的。

扯远了,函数式编程的好处就是代码灵活度加倍提高,可以写出各种秀操作的代码,显然这也是一把双刃剑。不过随着函数式编程越来越流行,大家的水平越来越高,写出来的函数式代码势必越来越好。

可以说Java程序员学习Kotlin唯一的难点就是函数式编程了,当然如果你本身就有函数式编程经验这点也不是事。如果没有的话就要好好学习参悟下函数式编程了,这是一个相对漫长的过程。在熟练掌握之前,不使用函数式编程也一样可以写Kotlin。

结语

总的来说我对Kotlin的评价总体是正面的。不过有些人的脑回路不正常,我还是想说一下:说Kotlin好,有优点,马上又有人惊呼Java要被取代啦!过两天又有人大喊Kotlin怎么怎么不好马上要凉。Java的好处和适用范围相信你也明白。而现在还在大量使用的语言都有它各自的优点,这个我就不唠了,毕竟水平不够。我是真恶心某些蹭热度、发软文各自骗的博主和公众号。

不要听信我和谷歌说它好,也不要听信那些碰瓷博主说它不好,有那时间坐而论道,为啥不抽出半小时来体验一下Kotlin呢?

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

推荐阅读更多精彩内容