使用Kotlin做開發(fā)一個(gè)月后的感想

本文由業(yè)松所寫,轉(zhuǎn)載請(qǐng)注明作者滑频。

談kotlin之前

有一類程序員,自己根本沒體驗(yàn)過的東西,看了幾篇嘩眾取寵的博文自己也來嘲諷似袁,我稱之為云程序員。就比如Kotlin殴胧,有人蹭熱度寫幾篇類似“我為什么從kotlin又回到j(luò)ava”的博文荚坞,就把kotlin一通批判。有空看看這些蹭熱度博文為啥不看看Android Developer官網(wǎng)所有示例代碼都是kotlin版本在前今妄,java版本在后呢郑口?

爭論語言、框架的優(yōu)劣是沒有意義的盾鳞。很多程序員總是對(duì)自己一直使用的語言犬性、框架大肆吹捧而對(duì)其他語言、框架各種貶低腾仅,很明顯這樣的程序員太狹隘了乒裆。Java確實(shí)常年排名第一,其他語言就沒有意義了嗎推励?當(dāng)然不是鹤耍,即使是批判,你也得自己真的體驗(yàn)過了才有資格吹艇。這可不是你行你上的翻版惰蜜,畢竟了解一門新語言對(duì)一個(gè)真正程序員老說是很輕松的事。

簡潔的語法

Kotlin給我的感覺就是它就是針對(duì)Java里所有的痛點(diǎn)來做改變的受神,比如語法繁瑣抛猖,煩人的空指針,缺少函數(shù)式編程支持(Java8雖然支持Lambda表達(dá)式但還遠(yuǎn)遠(yuǎn)不夠)等等鼻听。不像它的孿生兄弟Scala那樣奔放财著,Kotlin給我的感受是聰明又克制,對(duì)Java程序員來說半天就足夠上手開干了撑碴,不像Scala門檻那么高撑教。

Java語言是我所接觸過語言中語法最繁瑣的(有更繁瑣的請(qǐng)告知),這種繁瑣在main函數(shù)就可以體現(xiàn)醉拓,而且Java可能也是唯一一個(gè)幾乎沒法不用IDE的語言伟姐。其他語言脫離了IDE的語法警告和代碼生成模版也勉強(qiáng)能寫一寫收苏,Java代碼你沒有試試看?

但是Java的語法之嚴(yán)謹(jǐn)和繁瑣恰恰是Java如此流行的原因愤兵。沒寫過Java的人可能沒法理解這句話鹿霸。人們對(duì)于Java嚴(yán)苛的語法還不夠滿意,還要再加上check-style秆乳,findbugs以及各種XXX公司Java代碼規(guī)范等各種條條框框懦鼠,最終得到的結(jié)果是所有Java程序員寫出來的代碼都能互相看懂。即使是剛畢業(yè)不久的Java程序員屹堰,只要熟悉Java面向?qū)ο笳Z法肛冶,幾乎不存在看不懂其他Java代碼的情況(業(yè)務(wù)看不懂除外)。這樣保證了Java程序員的代碼下限非常之高扯键,能夠保證大型項(xiàng)目的成功睦袖。

好像扯Java扯的有點(diǎn)多了。接觸Kotlin之后會(huì)發(fā)現(xiàn)忧陪,kotlin在盡可能保持和Java一樣的語法嚴(yán)苛性的情況下扣泊,大幅度地精簡了Java代碼,寫起來非常之爽嘶摊。

//快速創(chuàng)建一個(gè)Bean類
data class Person(val id: Long, var name: String, var age: Int)

fun main() {
    // 創(chuàng)建實(shí)例
    val zhangsan = Person(0L, "zhangsan", 23)
    // set/get方法
    zhangsan.age = 24
    val name = zhangsan.name
    
    //copy方法
    val lisi = zhangsan.copy(id = 1, name = "lisi")
    //默認(rèn)生成的tostring和equals/hashcode方法延蟹,可重寫
    zhangsan.toString()
    zhangsan.hashCode()
    var isEqual = zhangsan.equals(lisi)
}

簡潔的語法無處不在,比如上面的Bean類如果用java來寫至少要多好幾倍的代碼叶堆。單例模式只需要把class換成object即可阱飘。這些雖然用Java的IDE的各種模版生成工具一樣可以秒生成,但是還是kotlin寫起來更舒服一些虱颗。

我想強(qiáng)調(diào)的是沥匈,Kotlin并不是無腦地利用語法糖和新關(guān)鍵字來精簡語法,我們可以很清晰地感受到Kotlin在設(shè)計(jì)過程中盡可能地保證它盡可能的語法嚴(yán)苛性忘渔。

空指針

Java的空指針異常被稱之為“Billion Dollar Mistake”高帖。在上家公司的時(shí)候?yàn)榱吮苊饪罩羔槷惓#a規(guī)范要求幾乎所有的對(duì)象都要進(jìn)行判空操作畦粮,那種嵌套很深的json對(duì)象散址,判空起來真的是又臭又長。

val name: String?
//這里要吐槽下為啥kotlin沒有三目運(yùn)算符宣赔?
name = if(Random.nextBoolean()) "Ann" else null
//加上预麸?則只在name不為null的時(shí)候會(huì)調(diào)用,得到的len1類型也是有問號(hào)的儒将,即Int?
val len1 = name?.length
//這種寫法是如果為空給一個(gè)默認(rèn)值吏祸,得到的len2類型為Int,不帶問號(hào)
val len2 = name?.length?:0
//加上雙感嘆號(hào)其實(shí)就是java什么都不加的寫法了钩蚊,如果為null會(huì)報(bào)空指針異常
val len3 = name!!.length

上面的代碼解釋了三種對(duì)可能為空的對(duì)象的處理贡翘。其實(shí)我把Kotlin對(duì)空指針的處理歸類為給所有對(duì)象加了個(gè)范型——符號(hào)蹈矮?,對(duì)于帶床估?的對(duì)象則表明它可能為空含滴,你不處理直接使用的話不讓編譯诱渤,也就是把空指針盡量扼殺在編譯期間丐巫。這個(gè)想法真的是簡單又巧妙。很多人一聽Kotlin就說沒有空指針了勺美,但是沒用過的話并不知道怎么實(shí)現(xiàn)的〉蓦剩現(xiàn)在再有面試官問你,知道怎么回答了吧赡茸?

函數(shù)式編程

fun AppCompatActivity.setupActionBar(@IdRes toolbarId: Int, action: ActionBar.() -> Unit) {
    val toolbar = findViewById<Toolbar>(toolbarId)
    setSupportActionBar(toolbar)
    supportActionBar?.run {
        //執(zhí)行參數(shù)中的函數(shù)缎脾,這樣用戶在調(diào)用該方法的時(shí)候更加靈活
        action()
    }
    toolbar.setNavigationOnClickListener {
        Log.d("AppCompatActivity", "finish")
        finish()
    }
}

//------------------------分割線-----------------------------
//類似的單方法接口現(xiàn)在只需要寫一個(gè)閉包就行了
binding.aliPayIcon.setOnClickListener {
    Log.d("example", it.contentDescription.toString())
}

//擴(kuò)展函數(shù)let,只有在對(duì)象不為空的時(shí)候會(huì)調(diào)用占卧,相當(dāng)于做了判空
binding.let {
    it.setLifecycleOwner(this@WithdrawActivity)
    it.viewModel = vm
}

//擴(kuò)展函數(shù)apply, 在閉包內(nèi)可直接調(diào)用對(duì)象的方法屬性遗菠,有個(gè)好處就是可以直接操作對(duì)象不需要先生成變量
vm.accountName.apply {
    this.value = "aaaa"
    Log.d("example", this.value?.toString() + ":" + this.hashCode())
}

//還有其他基礎(chǔ)擴(kuò)展函數(shù)run, with, also等等,可以看看這篇博客的介紹:http://www.reibang.com/p/28ce69d58fea

函數(shù)式編程對(duì)很多Java程序員來說是很陌生的华蜒。盡管我不想黑辙纬,但是Java真的強(qiáng)到讓很多Java程序員只會(huì)Java一門語言,并且基本上Java8以上的版本也沒接觸過叭喜。而除了Java(Java8以下)我還真不知道哪門語言不支持函數(shù)式編程贺拣。

幾乎所有語言都支持函數(shù)式編程,因此會(huì)靈活使用函數(shù)式編程真的挺重要捂蕴。Java不支持是因?yàn)楹瘮?shù)式編程相對(duì)要難一點(diǎn)譬涡,不支持函數(shù)式編程反而讓Java代碼的下限更高。除了難度大一點(diǎn)啥辨,函數(shù)式編程最令人不爽的就是閱讀性差(可能比較依賴寫代碼的人的水平)涡匀,我看Java框架源碼基本都很順暢,但是看JavaScript框架簡直懵逼溉知。我現(xiàn)在的水平看Kotlin函數(shù)式代碼也費(fèi)勁陨瘩,但是kotlin畢竟是強(qiáng)類型語言,函數(shù)的參數(shù)和返回值類型固定的話着倾,認(rèn)真讀還是不難讀懂的拾酝。

扯遠(yuǎn)了,函數(shù)式編程的好處就是代碼靈活度加倍提高卡者,可以寫出各種秀操作的代碼蒿囤,顯然這也是一把雙刃劍。不過隨著函數(shù)式編程越來越流行崇决,大家的水平越來越高材诽,寫出來的函數(shù)式代碼勢必越來越好底挫。

可以說Java程序員學(xué)習(xí)Kotlin唯一的難點(diǎn)就是函數(shù)式編程了,當(dāng)然如果你本身就有函數(shù)式編程經(jīng)驗(yàn)這點(diǎn)也不是事脸侥。如果沒有的話就要好好學(xué)習(xí)參悟下函數(shù)式編程了建邓,這是一個(gè)相對(duì)漫長的過程。在熟練掌握之前睁枕,不使用函數(shù)式編程也一樣可以寫Kotlin官边。

結(jié)語

總的來說我對(duì)Kotlin的評(píng)價(jià)總體是正面的。不過有些人的腦回路不正常外遇,我還是想說一下:說Kotlin好注簿,有優(yōu)點(diǎn),馬上又有人驚呼Java要被取代啦跳仿!過兩天又有人大喊Kotlin怎么怎么不好馬上要涼诡渴。Java的好處和適用范圍相信你也明白。而現(xiàn)在還在大量使用的語言都有它各自的優(yōu)點(diǎn)菲语,這個(gè)我就不嘮了妄辩,畢竟水平不夠。我是真惡心某些蹭熱度山上、發(fā)軟文各自騙的博主和公眾號(hào)眼耀。

不要聽信我和谷歌說它好,也不要聽信那些碰瓷博主說它不好胶哲,有那時(shí)間坐而論道畔塔,為啥不抽出半小時(shí)來體驗(yàn)一下Kotlin呢?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸯屿,一起剝皮案震驚了整個(gè)濱河市澈吨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寄摆,老刑警劉巖谅辣,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異婶恼,居然都是意外死亡桑阶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門勾邦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚣录,“玉大人,你說我怎么就攤上這事眷篇∥樱” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長虐杯。 經(jīng)常有香客問我玛歌,道長,這世上最難降的妖魔是什么擎椰? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任支子,我火速辦了婚禮,結(jié)果婚禮上达舒,老公的妹妹穿的比我還像新娘值朋。我一直安慰自己,他們只是感情好休弃,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布吞歼。 她就那樣靜靜地躺著,像睡著了一般塔猾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稽坤,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天丈甸,我揣著相機(jī)與錄音,去河邊找鬼尿褪。 笑死睦擂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杖玲。 我是一名探鬼主播顿仇,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼摆马!你這毒婦竟也來了臼闻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤囤采,失蹤者是張志新(化名)和其女友劉穎述呐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕉毯,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乓搬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了代虾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片进肯。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棉磨,靈堂內(nèi)的尸體忽然破棺而出江掩,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布频敛,位于F島的核電站项郊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏斟赚。R本人自食惡果不足惜着降,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拗军。 院中可真熱鬧任洞,春花似錦、人聲如沸发侵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刃鳄。三九已至盅弛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叔锐,已是汗流浹背挪鹏。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愉烙,地道東北人讨盒。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像步责,于是被迫代替她去往敵國和親返顺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容