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

jywhltj發表於2017-06-21

本文原發於:https://hltj.me/kotlin/2017/05/18/kotlin-official-on-android.html

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

在此之前很早,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 簡潔。瞭解更多請參見資料類。另外可以看到一個小細節,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 迴圈中的 trtdtable 類似, 只是它們有隱式接收者。 此外 for 迴圈的條件用到了解構宣告, 兩個 td 傳入的 Lambda 表示式都用到了操作符過載, 對於第一個還用到了字串模版



本文原是我在知乎上的回答,經整理並補充示例解析而來(然後又更新到回答答案中),知乎原文:如何看待 Google 將 Kotlin 選為 Android 官方語言?

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

相關文章