2011 年,做爲全球最早進 IDE 開發商之一的 JetBrains 揭露了一項正處於開發中的編程語言 —— Kotlin。它是一門跑在 JVM 上,和 Java 間具備高互操做性的全新語言。JetBrains 經過多年來和各類編程語言打交道的經驗,爲 Kotlin 整合了多項現代編程語言特性。html
2017 年,Google 在 I/O 大會上宣佈將 Kotlin 做爲 Android 開發的官方支持語言。彼時,Kotlin 的開發者社區開始了爆炸性的增加,而 Netflix、Pinterest、Trello、Kickstarter 等知名公司也早已開始使用 Kotlin。java
2018 年,目前 Kotlin 1.3 正式版本已經發布,更多的語言特性獲得了支持。而隨着官方提供了更多的編譯後端,也讓 Kotlin 擺脫了 JVM 的束縛,使用 Kotlin 編寫的代碼能夠編譯成機器碼甚至 JavaScript 而跑在不一樣的運行環境中。另外,根據 Google 官方的調查,目前已有 40% 的 Android 開發者選擇使用 Kotlin 進行編程工做,國內抖音、網易有道詞典、大衆點評、知乎等大量應用也開始引入 Kotlin。android
既然 Google 已經宣佈 Kotlin 成爲 Android 開發的官方支持語言,也說明了至少在 Android 開發上使用 Kotlin 目前已經毫無障礙了。那麼做爲 Android 開發者,對比 Java 而言,使用 Kotlin 語言能得到什麼好處呢?git
第一點,使用 Kotlin 可以讓咱們的代碼變得更簡潔。咱們都知道 Java 以它語法的嚴謹性而著名,它支撐起了世界上各類大型、複雜的計算機軟件。然而 ,它的語法是有歷史包袱並且略顯囉嗦的,對比更靈活的現代語言,使用 Java 來實現一樣的邏輯一般須要寫更多的代碼。而沒有歷史包袱的 Kotlin 則吸收了現代語言各類靈活簡潔的語法,讓開發者在 JVM 上也能寫出簡潔的代碼:github
// Java
final ArrayList<String> a = new ArrayList<>();
// Kotlin
val a = ArrayList<String>()
// Java
public String b(String c) {
return "Test: " + c.substring(2);
}
// Kotlin
fun b(c: String) = "Test: ${c.substring(2)}";
複製代碼
除了語法上的各類簡便,Kotlin 的標準庫也提供了不少實用的方法來精簡你的代碼,例如針對開發中最經常使用的「集合」,Kotlin 提供了封裝讓你能夠輕鬆建立集合類、使用和 Java Stream 類似但更豐富的接口來操做集合:編程
// 建立包含元素 一、三、五、7 的 ArrayList
arrayListOf(1, 3, 5, 7)
// 過濾出集合中大於 3 的元素
.filter { it > 3 }
// 轉換成字符串
.map { "$it, " }
// 循環輸出
.forEach { println(it) }
複製代碼
更多 Kotlin 比 Java 語法更精簡的例子能夠查看 From Java to Kotlin 。後端
第二點,使用 Kotlin 能讓你的程序更安全。Java 工程師最多見陷阱之一就是訪問了空的引用而致使空指針異常,而 Java 在語法上沒法描述某個引用是否可空,因此開發者要揹負起更多的心智負擔而不得不常常進行判空操做。雖然目前能夠經過 Annotation + IDE 提示的方式來必定程度上減輕這個負擔,但這並非一個強約束,在 IDE 上的提示是可被忽略的。安全
而 Kotlin 在語法上對此進行了強約束。在 Kotlin 中定義某個引用時必須描述其是否爲可空類型,對於可空類型引用的不安全訪問會在編譯期報錯:bash
// 不可空類型,能夠直接訪問
val a: String = ""
a.substring(2)
// 可空類型
val b: String? = null
b.substring(2) // 不安全訪問,編譯報錯
複製代碼
這有利於在運行前察覺並處理可能的空指針異常。並且 Kotlin 還提供了 ?.
、?:
、類型自動轉換等便捷的語法來輔助處理可空類型:app
val b: String? = null
b?.substring(2) // 當 b 不爲空時才調用 substring()
if (b is String) {
b.substring(2) // 自動把 b 轉換成不可空類型
}
val c = b ?: "" // 若是 b 爲空的話,則返回 ?: 操做符右邊的值
複製代碼
以上兩點是 Kotlin 能給大多數 Java 開發者帶來的直接好處。但 Kotlin 能給開發者帶來的也不只僅只有這些,它有着完美的 IDE 支持(這也正是 JetBrains 的強處),它與 Java 之間的高互操做性讓你能夠輕鬆使用 Java 生態中豐富的庫,而它對各類現代語言新特性(例如協程、函數式編程)的支持,能讓你在面對不一樣的計算機問題時有更多不一樣的思考和解決方式。
咱們要知道,任何編程語言在設計時都須要作各類取捨。Kotlin 在提供高靈活性的背後也須要開發者付出必定的代價:
實際上這也是大多數語法靈活、語法糖多的語言的共同問題。但咱們沒必要過於擔憂,經過使用強大的 IDE 和創建代碼規範這些問題都能被解決。做爲開發者,咱們應該把精力放在用更少的代碼、更快、更方便地描述出咱們想要的「邏輯」上,其餘的負擔都交給編譯器或 IDE 吧,這也正是高階編程語言誕生的初衷。
總所周知,因爲 Google 和 Oracle 之間的各類政治鬥爭,致使 Android 開發者一直以來只能用上閹割版的 Java。大部分開發者甚至是最近幾年纔開始用上、甚至開始知道 Lambda 表達式,而像 Stream 之類的工具更是無人知曉。雖然期間有傳聞過要支持 Go 和 Dart 語言,但很快也都音訊全無了。
而 Kotlin 的出現正好彌補了 Android 開發生態中一塊巨大的短板 —— 落後的開發語言。並且,Kotlin 和 Java 十分類似(甚至不少人把它認爲是 Java 的加強版),因此從 Java 過渡到 Kotlin 的門檻比起其餘語言來講相對更低。而基於 JVM 又讓 Kotlin 的代碼能夠很輕鬆地運行在 Android 平臺上。這麼看來,Kotlin 確實比起 Google 本身的 Go 和 Dart 來講更適合做爲 Android 平臺的開發語言,也難怪 Google 最終敲定 Kotlin。
縱觀將來,隨着 Google 和 JetBrains 深度的合做,Kotlin 也確定會成爲 Android 開發生態中最早進的工具之一。目前經過 Kotlin Android Extensions 已經能夠很方便地在 Activity 中直接經過 Id 名來直接訪問對應的 View:
import kotlinx.android.synthetic.main.activity_main.*
// 設置 id 爲 helloTextView 的 TextView 的文本
helloTextView.text = "Hello World!"
複製代碼
而 Google 官方推出的 KTX 庫 更是讓開發者可以更方便地使用 Kotlin 來開發 Android 應用:
// 使用 KTX 前
view.viewTreeObserver.addOnPreDrawListener(
object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
viewTreeObserver.removeOnPreDrawListener(this)
actionToBeTriggered()
return true
}
}
)
// 使用 KTX 後
view.doOnPreDraw {
actionToBeTriggered()
}
複製代碼
另一個好消息是,今年 11 月剛發佈的 Gradle 5.0 也宣佈支持了 Kotlin DSL,這意味着咱們甚至能夠用 Kotlin 來寫咱們的構建腳本了:
android {
compileSdkVersion(27)
defaultConfig {
applicationId = "com.test.app"
minSdkVersion(15)
targetSdkVersion(27)
versionCode = 1
versionName = "1.0"
}
}
複製代碼
因此從各類跡象來看,答案其實已經很明顯了。Kotlin 的誕生以及被 Google 的欽點,對一直以來被語言限制生產力的 Android 開發者們而言意義非凡。而就 Google 和 JetBrains 的影響力來看,將來幾年 Kotlin Android 開發者的數量將呈爆炸式增加,市場對於 Kotlin 工程師的需求也將會不斷增長。因此,學習 Kotlin 不但能讓你接觸到更先進的工具、思想,也確定能讓你在人才市場上更具競爭力。
事實上,根據 Github 今年發表的 Octoverse 報告 ,Kotlin 已經成爲增加速度最快的語言。
若是你已經對 Kotlin 產生興趣,能夠先經過官方的 Playground 來在線嘗試下 Kotlin 的語法。它還包括一些列用於演示各類語法的實例,以及一個完整的語法課程。
若是你想在本地建立一個全新的使用 Kotlin 編寫的 Android 應用項目,參照官方文檔中的 Getting started with Android and Kotlin 來進行便可,目前 Android Studio 已經徹底支持 Kotlin 語言。
而若是你想在一個使用 Java 的 Android 應用項目中同時使用 Kotlin,也是徹底沒問題的。經過上一個連接的教程引入 Kotlin Gradle Plugin,便可在你的源碼目錄下經過 Android Studio 菜單直接建立 Kt 源碼文件。
有人可能會擔憂使用過程當中遇到各類坑 。實際上,筆者在 2015 年就開始使用 Kotlin 了,期間在語法、IDE 支持、Kotlin 註解處理器上都遇到官方很多的坑,但因爲官方的迭代速度足夠快,不少問題很快就被修復了。另外,Kotlin 的社區也十分活躍,若是遇到坑或者問題也基本都能在上面找到回答。
而自從 16 年 Kotlin 1.0 發佈以後的版本就更加穩定了,工具鏈、IDE 支持也都十分完善。因此大可沒必要擔憂會遇到沒法解決的坑。
有科學家代表,使用不一樣的天然語言會影響人的思考方式。而編程,亦是如此。激進的 Kotlin 和保守的 Java 之間的差別,確定會給咱們帶來不同的思考問題的方式。而這些不同,也確定會影響將來 Android 開發的新風向。
在筆者看來,Android 開發界隨着 Kotlin 的出現實際上已經到了一個新的紀元,浪潮已來,爲了避免被浪潮所擊退,請用力擁抱 Kotlin 吧!