給 Java 程式設計師的 Kotlin

最後更新: 2023-06-24 05:18:44 +0800 +0800
tags: Kotlin | Java | Jvm
原文以英文撰寫。您正在閱讀AI翻譯版本。

Kotlin 會編譯為 JVM 位元組碼,並能直接與 Java 互通,同時提供 null 安全、簡潔宣告、 擴充函式與結構化並行等功能。

類別與建構函式 #

類別標頭中可有一個主要建構函式,類別主體中則可有次要建構函式。主要建構函式的參數 只有在標記為 val 或 var 時才會成為屬性;初始化程式碼應置於 init 區塊中。

kotlin
class Account(val id: String, initialBalance: Int) {
    var balance = initialBalance
        private set

    init {
        require(initialBalance >= 0)
    }

    constructor(id: String) : this(id, 0)
}

次要建構函式必須直接或透過另一個次要建構函式委派給主要建構函式。若主要建構函式搭配 預設參數能清楚表達 API,應優先採用該方式。

擴充與可為 Null 的型別 #

擴充函式在呼叫端看似執行個體方法,但它以靜態方式解析;它無法真正覆寫成員方法。

kotlin
fun String.initials(): String =
    trim().split(Regex("\\s+")).joinToString("") { it.take(1) }

Kotlin 會區分 String 與可為 null 的 String?。請使用安全呼叫(?.)、Elvis 運算子(?:)與明確檢查,而不要依賴 Java 風格的 null 假設。除非失敗確實是正確的 契約,否則應避免使用 !!。

協程 #

suspend fun 標示函式可以暫停而不阻塞其執行緒。底層 kotlin.coroutines 套件定義 了 CoroutineContext 和 Continuation 等原始元件;kotlinx.coroutines 程式庫 提供實用 API,且必須另外加入。

kotlin
class UserService(private val api: UserApi) {
    suspend fun load(id: String): User = api.fetch(id)
}

請從結構化的 CoroutineScope 啟動工作,而非使用 GlobalScope。Job 代表可取消的 工作,CoroutineDispatcher 則選擇執行執行緒;常用的 dispatcher 包括 Dispatchers.Default 與 Dispatchers.IO。取消採協作方式,因此暫停呼叫與迴圈不應 吞掉 CancellationException。

請使用 CoroutineExceptionHandler 回報根協程中未捕捉的例外,而不要將其當作一般 錯誤處理機制。子協程失敗與取消會遵循結構化並行規則,因而明確呈現生命週期。

評論

在 GitHub 上閱讀或評論(發表評論需要登入)