Google "招安"了Kotlin Kotlin初體驗(yàn)
今天多個(gè)群都炸了鍋,原因很簡(jiǎn)單: Google "招安"了Kotlin , 成為Android 平臺(tái)的first-class 開(kāi)發(fā)語(yǔ)言。
據(jù)說(shuō)在發(fā)布會(huì)上,這個(gè)消息的宣布獲得臺(tái)下最熱烈的歡呼聲。 這是為什么? 難道是因?yàn)锳ndroid開(kāi)發(fā)者一直羨慕iOS有簡(jiǎn)單好用的Swift, 但是自己只能用“傻大笨粗” 的Java, 現(xiàn)在終于可以翻身了,Kotlin救世主降臨了!
作為熱愛(ài)技術(shù)的碼農(nóng), 肯定***時(shí)間要去折騰一下。 不要在百度浪費(fèi)時(shí)間, 直奔官網(wǎng)(https://kotlinlang.org)就好。
嗯,官網(wǎng)還算大氣, 不過(guò)作為開(kāi)源的語(yǔ)言,應(yīng)該用個(gè)動(dòng)物做Logo 啊 :-) 參見(jiàn)《這個(gè)動(dòng)物園,兩年也逛不完》
一、Hello world 的秘密
Hello world很快就映入眼簾:
別看代碼很短,里邊藏著很多秘密:
1. 這是一個(gè)強(qiáng)類(lèi)型語(yǔ)言, 變量的類(lèi)型確定以后,就不能改了
沒(méi)有聲明類(lèi)型的msg 怎么辦? 肯定是自動(dòng)推導(dǎo)出來(lái)的, 是個(gè)字符串。此外 msg 類(lèi)型已經(jīng)確定為字符串, 你要是想把msg改成整數(shù): msg = 5 ,肯定是要報(bào)錯(cuò)的。
強(qiáng)類(lèi)型有個(gè)巨大的優(yōu)勢(shì),就是可以在編譯期自動(dòng)做類(lèi)型檢查, 幫助程序員發(fā)現(xiàn)很多錯(cuò)誤。
2. 怎么和Go, Scala一樣, 把類(lèi)型放到了變量名的后邊, 讓人有真氣逆行的感覺(jué), 不調(diào)整下還真容易走火入魔。為什么要這樣?
Kotlin 的FAQ上說(shuō): We believe it makes the code more readable. Besides, it enables somenice syntactic features, for instance, it is easy to leave type annotations out. Scala has also proven pretty well this is not a problem.
嗯,更有可讀性,漂亮的語(yǔ)法特征, 似乎有點(diǎn)道理, 到底是不是這樣還得再研究, 既然人家已經(jīng)確定這樣了,就慢慢適應(yīng)吧。
3. 為了輸出hello world終于不用寫(xiě)一個(gè)無(wú)用的類(lèi)了!
但是等等, 這個(gè)Kotlin 不是號(hào)稱(chēng)可以和Java 100%互操作嗎, 那java 程序想調(diào)用這些函數(shù)怎么辦? 沒(méi)有類(lèi)怎么調(diào)用?
稍微想一想就會(huì)明白, Kotlin背后肯定需要生成一個(gè)類(lèi), 在這里類(lèi)中有個(gè)靜態(tài)方法sum, 這樣才能讓別人使用嘛。
4. 我”熱愛(ài) ”的public static void 去哪里了? System.out去哪兒了
對(duì)不起, kotlin需要的是精簡(jiǎn)的語(yǔ)法, 已經(jīng)把細(xì)節(jié)給你隱藏起來(lái)了, 如果你用javap 看看背后生成的類(lèi),就會(huì)看到public static void main() 老老實(shí)實(shí)的在那里待著呢!
至于System.out,肯定是自動(dòng)導(dǎo)入了, 你要是不嫌麻煩,寫(xiě)成java.lang.System.out.println("hello world") 應(yīng)該也可以運(yùn)行。
二、基本語(yǔ)法
Kotlin支持定義一個(gè)只能賦值一次的變量, 其實(shí)就是final 了:
這個(gè)語(yǔ)法糖還是挺方便的, 要想定義一個(gè)真正的變量該怎么辦?還有一個(gè)關(guān)鍵字: var
至于那些流程控制語(yǔ)句 if, else, for ,while 實(shí)在是沒(méi)什么新奇的,跳過(guò)。
這個(gè)when 是很不錯(cuò)的, 比java中的switch 不知道要高到哪里去了, 簡(jiǎn)直讓人愛(ài)死了。
三、類(lèi)
感覺(jué)不錯(cuò)吧?
聲明了一個(gè)類(lèi), 構(gòu)造函數(shù)中的參數(shù)是name和age , 然后就可以當(dāng)做屬性來(lái)使用了,不用getter/setter 方法。
唉, 對(duì)我這個(gè)有分號(hào)強(qiáng)迫癥的人, 語(yǔ)句之間不寫(xiě)分號(hào)還是挺痛苦的, 慢慢適應(yīng)吧。
四、繼承和多態(tài)
一個(gè)類(lèi)想被繼承, 必須標(biāo)注為open 才行!
一個(gè)方法想被override , 展示出多態(tài), 父類(lèi)的方法也得open , 子類(lèi)需要聲明override!
這個(gè)規(guī)定要求真是嚴(yán)格啊!
五、Data class
在Java中我們經(jīng)常創(chuàng)建一些只保持?jǐn)?shù)據(jù),而沒(méi)有啥實(shí)際行為的類(lèi), 再來(lái)點(diǎn)語(yǔ)法糖:
hashCode, equals方法自動(dòng)生成
toString自動(dòng)生成
getter/setter自動(dòng)生成
很貼心吧?
六、集合
寫(xiě)程序,基本的數(shù)據(jù)結(jié)構(gòu)是必備, kotlin也有語(yǔ)法糖前來(lái)助陣:
正如你能想到的, Kotlin 可以輕松地調(diào)用Java 的集合來(lái)做事情。
七、總結(jié)
Kotlin的特性有很多,沒(méi)法在這里一一展示, 就體驗(yàn)到這里吧。
總的來(lái)說(shuō), Kotlin這門(mén)語(yǔ)言簡(jiǎn)化了Java , 完全是從一個(gè)是實(shí)用派的角度,而不是學(xué)院派的角度。
我在寫(xiě)代碼的時(shí)候,總是有一種寫(xiě)Javascript的感覺(jué)。
相比于JRuby , Jython這些一移植到JVM上的語(yǔ)言, Kotlin 和Java 和互操作感覺(jué)更加自然,但可能也是受限于Java平臺(tái), 寫(xiě)出的代碼還是沒(méi)有Ruby 那么優(yōu)雅。
每個(gè)語(yǔ)言的流行都需要一個(gè)引爆點(diǎn),就像Ruby on Rails 引爆了Ruby 一樣, Android 也許是之前不那么流行的Kotlin的引爆點(diǎn)。
如果你是Android 開(kāi)發(fā)者, 可以馬上學(xué)習(xí)下Kotlin ,畢竟有Google的支持,相比Java, Kotlin能極大的減少代碼量,代碼看起來(lái)也清晰易懂, 值得投入。如果是Java 后端程序員, 我覺(jué)得可以初步了解, 觀望一下。
【本文為51CTO專(zhuān)欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)coderising獲取授權(quán)】























 
 
 








 
 
 
 