如何看待 Google 將 Kotlin 選為 Android 官方語言?

I/O 大會


利益相關?:安卓開發者,去年7月開始使用 Kotlin。

對於我來說:
我的內心毫無波動,一點都笑不出來。
以前是用 Kotlin 血安卓程序,以後也是一樣用 Kotlin 血安卓程序,沒什麼區別。
目前裙里魚龍混雜,充滿了各種讓我深感不適的消息。
我還是懷念以前的日子,大家都很真誠,都積極發女裝 Play。

我想對你們說:
Kotlin 是個好語言,相比辣雞 Java 更簡潔、精鍊,多了很多 Java 沒有的特性(語法糖)。
但是 Kotlin 有坑。Kotlin 單獨跑的話,OK,萬事如意。你要和 Java 一起跑?官網說的100%兼容 Java 指的是 Kotlin 調用 Java 代碼。至於 Java 調用 Kotlin 代碼嘛,你會遇到各種各樣奇怪的問題。你以為加上 no-arg 和 all-open 就完了么?naive!
有些人認為寫安卓程序可以直接學 Kotlin 而不學 Java,也是 naive。你不學 Java 怎麼填哪些坑。
我就說個事實:Kotlin 相比 Java,方法數增加,運行速度更慢,佔用內存更多,還有互操作的問題,就問你怕不怕(手動斜眼)。
另外,別去當接盤俠,那些域名不值錢。

PS:
由於kotlin沒有模式匹配,該知乎賬戶所有者已瘋。本文是家養的貓代筆寫的。

PPS:

kotlin怎麼念?

聽好了:「鍋!特!靈!」

來來跟我重複一遍,三,二,一:「鍋!特!靈!」

歐腋~!

PPPS:好玩~真好玩~~

是時候專業勸退一波了

可以falldown的switch


Kotlin 作為 Android 開發語言是大勢所趨。

在此之前很早,Kotlin 就有「Android 世界的 Swift 」(Kotlin:Android世界的Swift )的稱號。當然在這之前大家這樣說難免有些底氣不足,與其說是一種事實不如說是一種願望。而現在這麼說就理直氣壯多了。當然之前就已經有很多地方在實踐用 Kotlin 做安卓開發了,比如魅族、騰訊, Kotlin 中文站 創始人, Kotlin 中文博客 維護人分別來自這兩家。

Kotlin 語言相對 Java 有很多優勢,比如官網介紹的簡潔、安全,例子見 Kotlin 中文站 首頁,部分示例解析見下文。Kotlin 具有現代(也有稱下一代的)靜態編程語言的很多特點,如類型推斷、多範式支持、可空性表達、擴展函數、DSL 支持等。另外對於安卓開發還提供了 Kotlin 安卓擴展和 Anko 庫,參見 Kotlin 用於 Android 。

關於與 Java 互操作,尤其是 Java 調用 Kotlin 是大家普遍覺得坑的地方,除了默認 final 外,還有一個主要原因應該就是名字修飾,解決方式可以按照它修飾後名字去引用,或者在 Kotlin 端使用 @JvmName 註解來生成便於 Java 使用的名字。具體參見 Java 中調用 Kotlin 。

讓我們看下官方給出的一些例子:

簡潔性

使用一行代碼創建一個包含 getters、 setters、 equals()、 hashCode()、 toString() 以及 copy() 的 POJO:

data class Customer(val name: String, val email: String, val company: String)

這個對於 Java 恐怕要寫半屏到一屏代碼,如果用 Lombok 能好一些,但也不及 Kotlin 簡潔。了解更多請參見數據類。

或者使用 lambda 表達式來過濾列表:

val positiveNumbers = list.filter { it &> 0 }

注意到了嗎?它用 it 來簡化單參數的 Lambda 表達式,了解更多請參見 Lambda 表達式。

想要單例?創建一個 object 就可以了:

object ThisIsASingleton {
val companyName: String = "JetBrains"
}

簡潔之至,無需贅述。了解更多請參見對象。

安全性 ——可空性表達 與 類型判斷

徹底告別那些煩人的 NullPointerException,畢竟價值萬億。

var output: String
output = null // 編譯錯誤

無特殊標誌的變數默認不可空。

Kotlin 可以保護你避免對可空類型的誤操作

val name: String? = null // 可空類型
println(name.length()) // 編譯錯誤

可空變數的類型需要後綴「?」,對於可空變數在未判斷其可空性時不可直接調用其方法或訪問其屬性。了解更多請參見空安全。 另外這裡用 val 聲明的變數是不可變的,對於不可變變數有很多好處,比如並發安全、適合函數式編程等等。參見基礎語法。

並且如果你檢查類型是正確的,編譯器會為你做自動類型轉換

fun calculateTotal(obj: Any) {
if (obj is Invoice)
obj.calculateTotal()
}

類型在判斷後自動轉換為相應對象;另外,對於可空變數,做非空性判斷的相應分支也能自動轉成非空值。

DSL

讓我們看一個複雜一點的例子,構造 HTML 的 DSL 代碼:

val data = mapOf(1 to "one", 2 to "two")
createHTML().table {
for ((num, string) in data) { // 遍曆數據
tr { // 創建 HTML 標籤的函數
td { +"$num" }
td { +string } // 輸出變數的值
}
}
}

這個例子比較複雜,建議對 Kotlin 熟悉一定程度再來看。 最上方聲明了一個不可變的 data 作為創建 HTML 用的數據,它是一個由 mapOf 函數創建的映射(map),其中用擴展函數 to 的中綴調用形式來創建鍵值對。 接下來的 table 是一個方法(或擴展函數), 它接受一個 Lambda 表達式,對於這種情況的函數調用可省略括弧。之後 for 循環中的 tr 和 td 與 table 類似, 只是它們有隱式接收者。 此外 for 循環的條件用到了解構聲明, 兩個 td 傳入的 Lambda 表達式都用到了操作符重載, 對於第一個還用到了字元串模版。

我是 Kotlin 中文站維護人,中文站就是 Kotlin 官方英文站的中文翻譯,目前已經完成參考文檔的翻譯:參考 - Kotlin 語言中文站 。這應該也是目前唯一一份最新且完整的官方參考文檔中文翻譯。歡迎大家反饋問題及一同翻譯。

另外歡迎關注 Kotlin中文博客 並積極投稿。

如果好玩的也可以投稿給千里冰封被吊打的日常 - 知乎專欄。


選擇 Kotlin 的原因很簡單:為節省工作量、便於開發者遷移,JVM 上的語言是首選。而 Kotlin 在工程性、學習曲線以及 Java 互操性上,我個人感覺要比 Scala、Clojure 和 Groovy 都好一些。

當然,對於成型的大項目來講,現在轉向 Kotlin 可能不是很好的選擇。Kotlin 目前的設計上都很多地方並不符合 principle of least astonishment;並且截至 Kotlin 1.1.2-3 版本,Android Lint for Kotlin 還比較陽春。

另外,Anko 剛剛發布的 0.10 RC 也很有趣,似乎想重新定位整個框架,不再以 layout 功能為核心。

我用 Kotlin 寫線上的 Android app 有一段時間了。由於 Kotlin 亦官方支持編譯到 JavaScript,我正在嘗試用 Kotlin 寫一套 code base,同時在 Android app 和 web app 中使用(奈何 kotlin-frontend-plugin 也還比較陽春)。

順便貼一篇今天寫的的短文:在 Kotlin 里用 Promise


我說怎麼我的專欄關注數猛漲呢,原來是 Google 爸爸的原因呀

沒想到知乎 Android 開發這麼多,短短一天專欄關注量就破兩千了,突然有種萌新翻身的感覺

沒什麼好說的,接著寫吧



拿Kotlin寫過compiler,內心毫無波動。

可能是因為自己是個菜雞切圖仔,對安卓開發興趣不太大,更多的興趣是Kotlin語言本身和其可編譯成JS的特性。Kotlin的起點很高,自己又是jb全家桶粉(趁著學生優惠),沒理由不去接觸一下。

Kotlin的官網上對於Kotlin的定位有三個(目前):JVM, Android 和瀏覽器。JS 迫切需要一個可以靜態編譯的 source,我希望Kotlin可以,但是事實是現在的Kotlin在瀏覽器端很沒有競爭力,過重是主要原因。Github 上有一些Kotlin 的 react-wrapper ,作為 react 的飯,有點不太能接受,冗雜是原因之一。但這畢竟只是開始,jb給了 Kotlin 那麼宏偉的設計藍圖,隨著 webAssembly 的普及,外加 Kotlin 在native上的發力,未來還挺期待的。

谷歌爸爸這次的硬點算是為在 Android 端推廣Kotlin打下了堅實的基礎,期待Kotlin之後的版本迭代。


被 Google 大佬欽點後的好處的是關注和使用的人會變多,整個環境會好一點。如果某公司自己使用了 Kotlin,那它推出一些框架或者庫的時候支持 Kotlin 的可能性會較大。

對於我個人來說,官方支持了 Kotlin 之後在 Android Studio 中使用 Kotlin 會少一些坑,因為 Google 會自己先踩一遍填坑。

PS:Android Studio 以後自帶 Kotlin 插件,萌新問這個插件怎麼下載不下來的幾率變小了


底下的程序員們討論過了:

就目前而言,可以學學,但咱是不會在工程里用的。


Google: 聽說android開發不值錢了 來來來 換門語言


可以轉kotlin了,

以後不懂kotlin的安卓開發者遲早要淘汰了,

或許一些流行的開源安卓應用也會轉kotlin了,

不學看不懂了,

Java只是備用方案了,

個人看法,

關鍵是既然谷歌宣布了支持kotlin,

以後有什麼新功能特性就不能不支持kotlin,

剛試了下kotlin配合databinding和剛出的那個room都還有些bug,


可以學,但是我不會在項目中用


jetbrains的勝利


恭喜微軟,vs2017又增加了一個成員。

ps: apple google 微軟,你們還是別折騰了,都用C++就好了,別再浪費人力了。


還早呢 你想想swift幾年了 開發有多少再用 慌什麼 等到kotlin普及了 也差不多退役了


可能我比較保守,但是語言只是工具,思想才是主要的,目前遇到的項目中還有很多舊的工程。目前開發環境,沒有驅使整個開發團隊的優勢。待我能力提升到一定高度的時候再考慮轉的必要吧。


還是先學起來吧,當然也不能說馬上就把java扔掉了,java還是得學好,畢竟現在辣么多的項目還是用java寫的,短時間內全部轉到kotlin是不可能的,單不說成本,還要考慮所帶來的收益,如果轉了之後,沒有巨大的優勢,我相信很多人是不太樂意轉的,具體可以看swift的情況,現在都已經到3.1了,還不是那麼多的項目還在用OC,所以說java很可能在很長一段時間內仍然是Android開發的主流語言。


github:JetBrains/kotlin

rx:ReactiveX/RxKotlin

中文文檔:Introduction · Kotlin-in-Chinese

官方Blog:Kotlin Blog

我也使用了一段時間,總體來說確實比java精簡了一部分代碼,但是編譯速度比java慢點,

但是不用寫分號了......

kotlin上手比較簡單,而且和java無縫兼容,而且現在goooogle又推薦用Kotlin開發

我的建議是先自己對著文檔寫個Sample,

我用kotlin寫的一個知乎專欄Sample

7449/ZLSimple


《Kotlin從入門到精通》

《瘋狂Kotlin講義》

《Kotlin實戰》

《深入理解Kotlin》

《Kotlin基礎入門》

《深入分析Kotlin技術內幕》

《Java的顛覆者——Kotlin》

《Android開發者的福音——Kotlin》

《Kotlin語言程序設計》

《Kotlin網路編程》

《Kotlin Web整合開發王者歸來》

書名已經為你們起好了,至於那些機構是要去官方文檔抄還是要去GitHub上抄就隨便吧。


這麼多年swift也沒能取代oc成為第一語言(¬_¬)


四月底離職後一直沒找到工作,做了三年半的Android,可能得轉崗啦!管它什麼語言,工作都沒有有什麼好談的!


推薦閱讀:

如何看待最近國產 Android 應用程序紛紛放棄 Android Design 的現象?
如何評價魅藍 6?
MIUI比aosp有何優勢?
為什麼Windows系統不能像安卓那樣把控軟體許可權?
如何評價《甲骨文:Android 是破壞開源的罪犯!》?

TAG:谷歌Google | Android | Kotlin |