作者:Mike Hearn??原文:Why Kotlin is my next programming language
Kotlin?是一門新的編程語(yǔ)言伦吠,它來(lái)自?JetBrains?—— 世界上最偉大 IDE 的開(kāi)發(fā)商。在做了許多研究后,我決定將 Kotlin 作為我未來(lái) 5 到 10 年的主力編程開(kāi)發(fā)語(yǔ)言搬俊。
我十分喜愛(ài) Kotlin瞭亮,它將會(huì)是一個(gè)很成功的項(xiàng)目蝗茁。人們看到我在開(kāi)源項(xiàng)目中使用了該語(yǔ)言后讓我介紹一下它,所以在本文中我將說(shuō)明為什么 Kotlin 是優(yōu)秀的嫂易,討論一些使用中可能會(huì)遇到的問(wèn)題,
注意:Kotlin 目前處于 beta 階段掐禁,有望于 2015 年底發(fā)布 1.0 正式版并且提供穩(wěn)定的標(biāo)準(zhǔn)庫(kù)怜械。
為什么說(shuō) Kotlin 是優(yōu)秀的
本文不會(huì)像一般介紹語(yǔ)言的文章那樣颅和,一開(kāi)頭就羅列出語(yǔ)言那些酷炫的特性,我們稍后再來(lái)探討這些內(nèi)容缕允。
首先我將介紹一些其它的信息峡扩,因?yàn)?a target="_blank" rel="nofollow">2013 年一項(xiàng)研究顯示,當(dāng)開(kāi)發(fā)者評(píng)估一種編程語(yǔ)言時(shí)生態(tài)系統(tǒng)要比語(yǔ)言特性更重要障本。這符合我個(gè)人的經(jīng)驗(yàn)教届,下面就讓我開(kāi)始介紹吧:
Kotlin 被編譯成 JVM 字節(jié)碼或者 JavaScript 代碼。Java 開(kāi)發(fā)者將會(huì)是對(duì)它最感興趣的人驾霜,不過(guò)對(duì)于使用垃圾收集運(yùn)行時(shí)語(yǔ)言的開(kāi)發(fā)者而言它也具有一定的吸引力巍佑,比如 Scala、Go寄悯、Python萤衰、Ruby 和 JavaScript 等語(yǔ)言。
Kotlin 來(lái)自業(yè)界猜旬,而不是學(xué)術(shù)界脆栋。它解決了開(kāi)發(fā)者現(xiàn)今面臨的實(shí)際問(wèn)題。例如它的類型系統(tǒng)可以幫助你避免空指針異常洒擦。
切換到 Kotlin 無(wú)需成本椿争!它是開(kāi)源的但這不是重點(diǎn),重點(diǎn)是它提供了一個(gè)高質(zhì)量的一鍵從 Java 轉(zhuǎn)換到 Kotlin 的工具熟嫩,并且十分關(guān)注 Java 二進(jìn)制文件的兼容性秦踪。你可以將現(xiàn)有 Java 項(xiàng)目的一次性轉(zhuǎn)換成 Kotlin 項(xiàng)目,而該項(xiàng)目仍將可以正常編譯掸茅,即使這是一個(gè)包含上百萬(wàn)行代碼的復(fù)雜程序椅邓。
顯然你可以從上文得知,Kotlin 程序能夠使用所有現(xiàn)存的 Java 框架和庫(kù)昧狮,甚至那些依賴注解處理的高級(jí)框架景馁。它們之間的交互是無(wú)縫的,不需要包裝或者適配層逗鸣。Kotlin 可以整合 Maven合住,Gradle 以及其它構(gòu)建系統(tǒng)。
它十分平易近人撒璧,語(yǔ)法精煉直觀透葛,僅僅是閱讀語(yǔ)言參考文檔幾個(gè)小時(shí)就能學(xué)會(huì)使用。Kotlin 看起來(lái)十分像 Scala 但是更加簡(jiǎn)潔并且兼顧了可讀性卿樱。
它不遵循特定的編程哲學(xué)僚害,例如極度的函數(shù)式編程或者面向?qū)ο缶幊田L(fēng)格。
它不會(huì)增加運(yùn)行時(shí)的開(kāi)銷殿如。Kotlin 的標(biāo)準(zhǔn)庫(kù)十分小巧緊湊:專注于擴(kuò)展 Java 標(biāo)準(zhǔn)庫(kù)贡珊,編譯階段的大量?jī)?nèi)聯(lián)操作意味像 map/filter/reduce 等管道結(jié)構(gòu)函數(shù)將被編譯成類似于命令式語(yǔ)言的代碼最爬。
Anko?與?Kovenant?等框架的出現(xiàn)意味著在 Android 開(kāi)發(fā)者中 Kotlin 開(kāi)始變得流行起來(lái)。如果你正在從事 Android 相關(guān)的工作门岔,相信你很快就會(huì)獲得好的工作爱致。你可以閱讀這份?Square 公司開(kāi)發(fā)者 JakeWharton 的報(bào)告,了解用 Kotlin 進(jìn)行 Android 開(kāi)發(fā)的體驗(yàn)寒随。
Kotlin 允許你繼續(xù)使用你的工作效率提升工具糠悯。IntelliJ 的 IDE 對(duì) Kotlin 的支持十分完善:你可以對(duì)代碼進(jìn)行重構(gòu)、搜索妻往、導(dǎo)航以及使用自動(dòng)完成互艾,而且 IDE 充分支持調(diào)試、單元測(cè)試讯泣、性能分析等等功能纫普。
除了 Android,我認(rèn)為?Kotlin 還非常適用于企業(yè)中 Java 的應(yīng)用場(chǎng)景好渠。如果你的工作是整天埋頭于大公司的代碼庫(kù)中昨稼,那么當(dāng) Kotlin 1.0 版本正式發(fā)布時(shí)你應(yīng)該盡快去了解一下:
由知名公司為它提供強(qiáng)大的商業(yè)支持。 JetBrains 這家公司 有一個(gè)高度稱職的大團(tuán)隊(duì)致力于該項(xiàng)目拳锚,有穩(wěn)定的商業(yè)模式甚至在自己的部分旗艦產(chǎn)品中使用 Kotlin假栓,這表明短期內(nèi) Kotlin 不會(huì)被放棄。
使用 Kotlin 風(fēng)險(xiǎn)較低:可以由一兩個(gè)感興趣的團(tuán)隊(duì)成員在項(xiàng)目中小范圍的試驗(yàn) Kotlin霍掺,這并不會(huì)擾亂你的項(xiàng)目匾荆,因?yàn)?Kotlin 的類對(duì)外提供的 Java API 看起來(lái)就與普通的 Java 代碼一樣。
因?yàn)?Kotlin 十分注重語(yǔ)法的可讀性杆烁,代碼審查不會(huì)成為問(wèn)題牙丽,對(duì) Kotlin 不熟悉的團(tuán)隊(duì)成員仍然能夠完成該工作。
Kotlin 基于 Java 6连躏,所以假如你難以在項(xiàng)目中升級(jí)使用新版本的 JVM剩岳,你可以使用 Kotlin贞滨。
今年早些時(shí)候我向 Swiss Re 這家瑞士再保險(xiǎn)公司的團(tuán)隊(duì)(他們使用 Java 和 .NET)展示了 Kotlin入热。首先我定義了一個(gè)簡(jiǎn)單的 Java 類包含一些字段以及 toString、equals晓铆、hashCode 等方法勺良,大概有 50 行代碼。然后我將它轉(zhuǎn)換成 Kotlin 代碼(大部分是自動(dòng)完成的)骄噪,結(jié)果僅剩 1 行代碼尚困,接著我還演示了其它節(jié)省時(shí)間的特性。他們看過(guò)后對(duì) Kotlin 充滿了熱情并且認(rèn)為 Kotlin 是它們項(xiàng)目中 C# 語(yǔ)言的一個(gè)潛在競(jìng)爭(zhēng)對(duì)手链蕊。
我認(rèn)為 Kotlin 正中企業(yè) Java 開(kāi)發(fā)者的紅心事甜,所以盡管 Kotlin 是免費(fèi)的谬泌,JetBrains 還是能夠通過(guò)它增加商業(yè)版本 IDE 的銷售來(lái)賺大錢。這將激勵(lì)他們根據(jù)用戶的意愿持續(xù)改進(jìn)它逻谦。
與此相比掌实,對(duì)于那些由不相關(guān)產(chǎn)品資助的語(yǔ)言開(kāi)發(fā)者來(lái)說(shuō),當(dāng)用戶需求與之前的設(shè)計(jì)理念沖突時(shí)邦马,他們很少會(huì)因此作出調(diào)整贱鼻。
特性
Kotlin 作為一門新的編程語(yǔ)言能夠脫穎而出,是因?yàn)樗P(guān)注生態(tài)系統(tǒng):JetBrains 懂得生產(chǎn)力的高低更多的取決于生態(tài)系統(tǒng)而不是便捷的語(yǔ)法滋将。
盡快如此邻悬,Kotlin 還是有許多有用的特性能讓你編碼的過(guò)程變得愉快:
我們已經(jīng)提過(guò)?null 安全(可選),它能夠讓編譯器系統(tǒng)的標(biāo)記潛在的空指針引用随闽。與一些語(yǔ)言不同的是它不涉及 option 類父丰,因此是零開(kāi)銷的,并且還有其它語(yǔ)言特性確保它不會(huì)造成不便掘宪。
精煉的語(yǔ)法:無(wú)處不在的類型推斷础米、簡(jiǎn)單的函數(shù)只需要一行、簡(jiǎn)單的結(jié)構(gòu)以及 JavaBeans 也只需要一行就能聲明添诉、真正的屬性——可以在背后自動(dòng)生成 getFoo/setFoo 方法用于與 Java 進(jìn)行交互屁桑、函數(shù)可以獨(dú)立存在于類之外。
異常均為非檢查型栏赴。(譯者注:感興趣的可以閱讀一下Java 理論與實(shí)踐: 關(guān)于異常的爭(zhēng)論)
使用?data class?關(guān)鍵字創(chuàng)建數(shù)據(jù)類會(huì)自動(dòng)生成通用方法蘑斧,例如 equals、hashCode须眷、toString 以及 copy 和 componentN(同時(shí)聲明多個(gè)變量時(shí)會(huì)調(diào)用該方法)竖瘾。這將幫助你在不使用構(gòu)建器的情況下便捷的獲得不變類(immutable classes)。
但如果你需要構(gòu)造復(fù)雜的結(jié)構(gòu)體花颗,借助類型安全的構(gòu)建器這個(gè)特性可以簡(jiǎn)潔的實(shí)現(xiàn)捕传。如果你使用 Google Protocol Buffers 來(lái)存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù), 通過(guò)?KBuilders?這個(gè)庫(kù)也能很輕易做到扩劝。
支持函數(shù)式編程以及零開(kāi)銷的 lambda 表達(dá)式庸论,能夠在 Java 的集合中做 Map、Filter棒呛、Folder 等處理聂示。Kotlin 的類型系統(tǒng)能夠自動(dòng)識(shí)別可變或者不可變的集合。
擴(kuò)展函數(shù)特性能夠讓你在不改動(dòng)源碼的情況下為類添加方法簇秒。乍眼一看以為是為了避免寫出像 FooUtils 這種風(fēng)格工具類的語(yǔ)法糖鱼喉,不過(guò)隨著使用的加深,你會(huì)認(rèn)識(shí)到它不僅能幫你更加容易的通過(guò)自動(dòng)完成使用方法,還能協(xié)助你集成現(xiàn)有的 Java API 以及借助其它 Kotlin 特性構(gòu)建功能強(qiáng)大的擴(kuò)展扛禽。
支持運(yùn)算符重載锋边,但是不會(huì)像 Scala 或者 Perl 那樣出現(xiàn)難以理解的代碼。運(yùn)算符被映射成相應(yīng)名字的方法编曼,通過(guò)重寫這些方法改變運(yùn)算符的行為(包括函數(shù)調(diào)用)宠默,但是不能定義新的運(yùn)算符。這使得程序能夠兼顧功能與可讀性灵巧。
Kotlin 沒(méi)有宏或者其它的方式來(lái)重定義語(yǔ)言搀矫,但是通過(guò)這些精心設(shè)計(jì)的特性能夠使第三方庫(kù)自由的對(duì)它進(jìn)行擴(kuò)展,官方對(duì)集合類進(jìn)行的擴(kuò)展也只是小試牛刀而已刻肄,請(qǐng)看以下例子瓤球。
想使用?fibers、actors 和 Go 風(fēng)格的 channels敏弃?一個(gè)名為?Quasar?的庫(kù)已經(jīng)為你實(shí)現(xiàn)了卦羡。
使用 Markdown 替代 HTML?來(lái)編寫 API 文檔,這樣編寫 JavaDocs 可比以前舒適多了麦到。(譯者注:JetBrains 提供了相應(yīng)的文檔生成器?Dokka)
更好用的泛型绿饵。如果你沒(méi)有完全掌握泛型參數(shù)中 super 以及 extends 的含義,別擔(dān)心瓶颠,這不是你的錯(cuò)拟赊。Java 的泛型的確令人費(fèi)解,Kotlin 解決了這個(gè)問(wèn)題粹淋。
委托是一個(gè)大家都知道的設(shè)計(jì)模式吸祟,Kotlin 原生支持它。
== 運(yùn)算符的行為符合預(yù)期(譯者注:簡(jiǎn)單來(lái)說(shuō) a == b 相當(dāng)于 a.equals(b)桃移;新增了 === 運(yùn)算符屋匕,用來(lái)判斷運(yùn)算符兩邊是否指向同一個(gè)對(duì)象)
想快速便捷的進(jìn)行異步編程嗎?當(dāng)然借杰!
字符串插值“可以使用這樣的寫法在字符創(chuàng)中直接引用變量 {this.example}”
函數(shù)中的參數(shù)可以指定默認(rèn)值过吻、使用可變長(zhǎng)度以及通過(guò)參數(shù)名傳參。
還有許多的調(diào)整與優(yōu)化蔗衡。假如 Java 中有某些讓你覺(jué)得困擾的問(wèn)題纤虽,我相信 Kotlin 一定已經(jīng)把它處理好了。
現(xiàn)在就來(lái)試用一下粘都!
跟很多現(xiàn)代編程語(yǔ)言一樣廓推,Kotlin 可以通過(guò)網(wǎng)頁(yè)瀏覽器來(lái)進(jìn)行體驗(yàn)。不過(guò)跟其他語(yǔ)言不一樣的是翩隧,Kotlin 的實(shí)驗(yàn)網(wǎng)站提供了一個(gè)成熟的 IDE踪栋,包括響應(yīng)很快的自動(dòng)完成,實(shí)時(shí)的后臺(tái)編譯刨疼,甚至還有在線的靜態(tài)分析狰挡!
好了,讓我們繼續(xù)接下來(lái)的內(nèi)容
目前存在哪些問(wèn)題淑仆?
生活中沒(méi)有什么是完美的涝婉,包括 Kotlin。以下是我嘗試這門語(yǔ)言時(shí)遇到的一些問(wèn)題蔗怠。
最大的問(wèn)題是不夠成熟墩弯,因?yàn)?Kotlin 目前還處于 Beta 階段,這意味著:
每更新一個(gè)版本寞射,語(yǔ)法渔工、ABI 以及標(biāo)準(zhǔn)庫(kù)就變一次。好消息是這些變化通常比較微小桥温,可以借助 IntelliJ IDE 來(lái)自動(dòng)升級(jí)你的代碼引矩,所以這個(gè)過(guò)程并不會(huì)太麻煩。
Java-to-Kotlin 的轉(zhuǎn)換工具(J2K)還沒(méi)有完成侵浸。它偶爾會(huì)大規(guī)模的破壞和默默地擦除 Java 8 中的 Lambdas(修改:2015 年 10 月:M13 版本的轉(zhuǎn)換工具已經(jīng)可以正確地處理 Java 8 的特性了)旺韭。由它轉(zhuǎn)換而成的代碼并不總是最好的寫法,但是 JetBrains 為這個(gè)工具付出了大量努力掏觉,它已經(jīng)是我用過(guò)的語(yǔ)言轉(zhuǎn)換工具中最好的了区端。所以我并不太擔(dān)心這個(gè)問(wèn)題,這個(gè)轉(zhuǎn)換器正在迅速的改進(jìn)中澳腹,變得越來(lái)越成熟珊燎。
你會(huì)遇到編譯器錯(cuò)誤。盡管我的程序并不大遵湖,但還是會(huì)發(fā)生無(wú)法編譯的情況悔政,甚至錯(cuò)誤的編譯結(jié)果。診斷這些問(wèn)題并不難延旧,但終歸還是影響了開(kāi)發(fā)的體驗(yàn)谋国。
你會(huì)遇到 IDE 內(nèi)部錯(cuò)誤。當(dāng)這個(gè)錯(cuò)誤發(fā)生時(shí)迁沫,IntelliJ IDE 會(huì)彈出一個(gè)懸浮窗口芦瘾,附帶向 JetBrains 報(bào)告的選項(xiàng)。大部分錯(cuò)誤無(wú)需理會(huì)集畅,不過(guò)依然會(huì)使人厭煩近弟。
偶爾會(huì)出現(xiàn)無(wú)法加載提示文檔的錯(cuò)誤(修改:M14 版本發(fā)布后,這個(gè)問(wèn)題已被修復(fù))
目前 JetBrains 正致力于完善發(fā)布 1.0 版本而不是添加新的功能挺智,期待這些問(wèn)題能夠得到修復(fù)祷愉。
第二個(gè)我遇到的比較大的問(wèn)題是,有時(shí)與 Java 的交互會(huì)受到局限。
一個(gè)典型的 Bug 是 Java 的類型系統(tǒng)無(wú)法防止你改變 Map 中 Key 的類型二鳄。按理來(lái)說(shuō)赴涵,這樣操作應(yīng)該導(dǎo)致編譯器報(bào)錯(cuò),例如使用類型錯(cuò)誤的 Key 刪除元素订讼。有些 JDK 中的集合使用了泛型髓窜,它們某些重要方法的泛型參數(shù)是 Obejct,所以編譯器不會(huì)提示欺殿。當(dāng)在 IntelliJ IDE 中編寫 Java 代碼時(shí)會(huì)有靜態(tài)分析的警告寄纵,但是目前 Kotlin 環(huán)境還沒(méi)有這個(gè)功能。因?yàn)?Kotlin 使用的是 Java 的集合框架沒(méi)有自己實(shí)現(xiàn)脖苏,所以這導(dǎo)致了一些類型安全方面的問(wèn)題程拭,我已經(jīng)遇到好幾次了。
(修改:1.0 Beta 版本中這個(gè)問(wèn)題已經(jīng)解決了帆阳,Java 中集合框架的類型安全缺陷在 Kotlin 已經(jīng)不復(fù)存在哺壶。喲呵!)
另一個(gè)例子是蜒谤,當(dāng)調(diào)用或使用 Java 代碼時(shí) Kotlin 的 Null 安全特性無(wú)法發(fā)揮作用(可以借助注解彌補(bǔ))山宾。作為 Kotlin 的初學(xué)者,剛開(kāi)始你可能會(huì)寫許多調(diào)用 Java 庫(kù)的代碼鳍徽,但是因?yàn)橐陨系膯?wèn)題它們并沒(méi)有你想象中那么好用资锰。這種情況的改善只能等待 Kotlin 使用人數(shù)的增長(zhǎng)。JetBrains 一直在嘗試使 Null 安全特性能體現(xiàn)在 Java 交互中阶祭,這種想法是好的绷杜,但有時(shí)考慮并太周全。(修改: 從 M13 版本開(kāi)始濒募,在 Java 代碼中將自動(dòng)以 @NotNull @Nullable 等注解實(shí)現(xiàn) Kotlin 的 Null 安全特性)
雖然有以上的問(wèn)題存在鞭盟,但同時(shí)也使得我們能更流暢的使用 Java API,我覺(jué)得這種權(quán)衡是值得的瑰剃,只是在開(kāi)發(fā)中要注意齿诉。
其它需要考慮的問(wèn)題:
Kotlin 的社區(qū)還比較小。雖然目前沒(méi)有多少 Kotlin 的庫(kù)可以使用晌姚,但是憑借優(yōu)秀的 Java 交互能力粤剧,Kotlin 可以使用現(xiàn)有成熟的 Java 庫(kù)。
如果你喜歡看書來(lái)學(xué)習(xí)挥唠,那么你需要等到今年晚些時(shí)候才能看到 Kotlin 開(kāi)發(fā)者寫的書(譯者注:Kotlin in Action)
純粹的函數(shù)編程風(fēng)格開(kāi)發(fā)者可能會(huì)覺(jué)得類型系統(tǒng)中缺乏一些 Scala 或 Haskell 擁有的高級(jí)功能抵恋。如果你對(duì)類型系統(tǒng)一些功能比較看重,那么 Kotlin 可能不適合你宝磨。
Kotlin 還能編譯成 Javascript 代碼弧关,但是比較少用盅安,所以可能會(huì)遇到更多的問(wèn)題,這是我從論壇中得到的印象梯醒。(修改: 目前 Kotlin 的開(kāi)發(fā)重心在于完成 1.0 版本并使其穩(wěn)定運(yùn)行在 JVM 中宽堆,Javascript 方面的問(wèn)題將會(huì)在 1.0 發(fā)布后著手解決)
沒(méi)有標(biāo)準(zhǔn)的編程風(fēng)格指南腌紧,目前 Kotlin 提供了多種語(yǔ)法可供選擇茸习。不同人寫出來(lái)的 Kotlin 代碼很可能完全不一樣。這與 Go 嚴(yán)格的風(fēng)格形成了鮮明的對(duì)比壁肋。(修改: Kotlin 1.0 版本開(kāi)始号胚,一些靈活的語(yǔ)法已經(jīng)被移除了,例如現(xiàn)在重載運(yùn)算符以及定義中綴函數(shù)時(shí)必須分別使用 operator 和 infix 關(guān)鍵字進(jìn)行標(biāo)記)
Kotlin 的編譯速度稍稍慢于 Java浸遗,以及 IntelliJ IDE 的智能提示反應(yīng)有點(diǎn)緩慢猫胁,不算嚴(yán)重而且比 Scala 快多了。(修改:Kotlin 1.0 開(kāi)始編譯速度有了明顯提升)
Kotlin 有一個(gè) Eclipse 插件跛锌,但是很明顯沒(méi)有 IntelliJ 的好用弃秆。
Kotlin 在某些方面比 Java 要嚴(yán)格。它不會(huì)自動(dòng)將 Int 轉(zhuǎn)換為 Long 類型髓帽,需要開(kāi)發(fā)者顯示的轉(zhuǎn)換菠赚。這是因?yàn)?Kotlin 關(guān)注正確性和試圖解決《Java Puzzlers》一書中提出的問(wèn)題。JetBrains 聲稱他們已經(jīng)搞定一半了郑藏。
Kotlin 基于 Java 6衡查,因此會(huì)受到它的局限。Kotlin 與 C# 在很多領(lǐng)域都很相似甚至比 C# 做得更好必盖,但是它缺少一些功能拌牲,例如 Java 平臺(tái)尚未支持的某些數(shù)據(jù)類型。
為什么應(yīng)該開(kāi)始考慮使用 JVM
最近一段時(shí)間我遇到了很多使用動(dòng)態(tài)腳本語(yǔ)言(JavaScript 或者 Go —— 譯者注:Go 應(yīng)該是靜態(tài)編譯型語(yǔ)言)的創(chuàng)業(yè)公司歌粥。
我在 Bitcoin Space 工作的時(shí)候塌忽,使用動(dòng)態(tài)語(yǔ)言是非常痛苦的事情。在這些語(yǔ)言里沒(méi)有安全性的類型失驶,這已經(jīng)導(dǎo)致了巨大的貨幣損失土居。Go 比較少出錯(cuò),但是在基礎(chǔ)層面上給人的體驗(yàn)依然很差突勇,比如說(shuō)缺少好的調(diào)試工具装盯,快速 GC 機(jī)制,穩(wěn)健的管理器以及可靠的分析工具甲馋。
過(guò)去 15 年或者更長(zhǎng)時(shí)間里埂奈,Java 變得越來(lái)越健壯,越來(lái)越冗長(zhǎng)定躏,甚至有過(guò)度設(shè)計(jì)的跡象账磺,這些變化很大程度上源于它的聲譽(yù)芹敌。企業(yè)級(jí) Java 類的名字?PathVariableMapMethodArgumentResolver?就是例證。在很長(zhǎng)一段時(shí)間里我沒(méi)有考慮 JVM垮抗,我確信這種環(huán)境并不適合我氏捞。
最終我因?yàn)?Android 被迫回到 Java,發(fā)現(xiàn) Java 的開(kāi)發(fā)環(huán)境已經(jīng)改變了冒版。雖然 XML 仍然不合時(shí)宜的頻繁出現(xiàn)在各種場(chǎng)合液茎,但是一些基礎(chǔ)功能十分完善,令人印象深刻辞嗡。 IntelliJ 是比 Eclipse 更快并且更智能的 IDE捆等。Maven 一出現(xiàn)就得到了迅速的發(fā)展,擁有許多原本我想要其它構(gòu)建 / 依賴系統(tǒng)增加的功能续室。較新的 Web 框架像 Ninja 和 Play 從類似 Ruby on Rails 的框架中學(xué)到了輕量簡(jiǎn)潔栋烤。有大量的庫(kù)可供使用。硬件性能變得更高以及 JVM 變得更有效率挺狰,等等轉(zhuǎn)變明郭。
沒(méi)有真正改變的是語(yǔ)言本身,Java 代碼寫起來(lái)依然是令人不快的冗長(zhǎng)丰泊。
現(xiàn)在有了 Kotlin薯定,完全無(wú)需承受離開(kāi) Java 現(xiàn)有的生態(tài)系統(tǒng)的疼苦。你可以編寫更富有表現(xiàn)力的代碼趁耗,但是卻比腳本語(yǔ)言更簡(jiǎn)潔沉唠,同時(shí)擁有更好的性能和更少的錯(cuò)誤。
如果你喜歡 JavaScript苛败,可以嘗試 Kotlin 的 JS 后端满葛,或者在?Nashorn JS?引擎里運(yùn)行你現(xiàn)有的代碼。
最后罢屈,如果你喜歡 Go 語(yǔ)言是因?yàn)樗梢跃幾g獨(dú)立運(yùn)行的程序嘀韧,那么試試 javapackager 工具。Kotlin 在本地為每個(gè)平臺(tái)創(chuàng)建了捆綁包缠捌,這意味著在 linux 上不需要 JRE 的依賴就可以獨(dú)立自主的獲取 DEBs(linux 的安裝包)或者壓縮包锄贷。當(dāng)然,它拆包之后不是單個(gè)文件而是單個(gè)目錄曼月,從部署的角度來(lái)看并不難操作谊却。
簡(jiǎn)而言之:如果你之前因?yàn)榭?Java 不順眼而忽略了 JVM 的生態(tài)系統(tǒng),那么你應(yīng)該借著 Kotlin 這門新語(yǔ)言進(jìn)入這個(gè)世界瞧瞧哑芹。