Kotlin 2.1.0 和 2.2.0 的主要差異

Kotlin 2.1.0 和 2.2.0 的主要差異在於功能的「成熟度」與「編譯器規範」。

2.1.0 是許多新特性的試用期,而 2.2.0 則是將這些功能正式轉為穩定版,並加強了代碼規範的檢查。

核心功能差異

  • 語法穩定化:在 2.1.0 還是預覽的功能,如 when 表達式中的 guard 條件(when (x) { is String if x.isNotEmpty() -> ... })、非局部 breakcontinue、以及多個 $ 符號的字串模板,在 2.2.0 都變成了正式穩定版。
  • 預設介面方法 (JVM):2.2.0 改變了 JVM 上的編譯方式。現在介面中的預設方法會直接編譯成 Java 的 default 方法,不再產生額外的 DefaultImpls 類別,這讓 Kotlin 與 Java 的交互更自然,字節碼也更簡潔。
  • 標準庫加強:2.2.0 正式引入了穩定的 Base64HexFormat API,以後處理編碼就不需要再找第三方函式庫或依賴特定平台。
  • 上下文參數 (Context Parameters):2.2.0 引入了這個新功能的預覽版(取代舊的 context receivers),這對簡化依賴注入和提升代碼可讀性很有幫助。

Android 開發者的影響

  • 更嚴格的檢查:2.2.0 把很多 2.1.0 裡的警告提升到了錯誤級別。例如,如果你在 type aliases 裡用了不該用的 reified 修飾符,2.1.0 只會提醒你,2.2.0 會直接報錯不讓你編譯。
  • 記憶體優化:Kotlin/Native 在 2.2.0 針對 Apple 平台(iOS)有更細緻的記憶體分配管理,這對 KMP(Kotlin Multiplatform)專案很有感。
  • 編譯器警告管理:2.2.0 提供了統一的 -Xwarning-level 選項,讓你能更方便地控制專案中警告的顯示方式。

總結與建議

如果你是新專案,直接上 2.2.0 比較好,因為它的標準庫更完整,語法也更穩定。

但如果是舊專案升級,從 2.1.0 升到 2.2.0 可能會遇到一些編譯報錯(因為 2.2.0 把一些舊的不良語法警告變成了錯誤),需要花點時間修正代碼。


想了解具體的 when guard 語法範例,或是如何使用新的 Base64 API 嗎?

when guard 語法範例

這是 Kotlin 2.2.0 中最實用的新功能之一。它讓你在匹配類型的同時,可以直接加上額外的判斷條件,不需要在裡面多寫一層 if。

Kotlin

// 2.2.0 的寫法
when (response) {
    is Success if response.data.isEmpty() -> println("成功但沒資料")
    is Success -> println("拿到資料了")
    is Error if response.code == 404 -> println("找不到頁面")
    else -> println("其他錯誤")
}

在 2.1.0 以前,你必須寫成 is Success -> if (response.data.isEmpty()) ...,程式碼層級會變得比較深。現在這樣寫更直覺,閱讀起來很像在讀英文句子。


Base64 API 範例

以前在 Android 裡處理 Base64,我們通常會用到 android.util.Base64。但這會導致你的程式碼綁死在 Android 平台上。2.2.0 把這個功能放進了 Kotlin 標準庫。

import kotlin.io.encoding.Base64
import kotlin.io.encoding.ExperimentalEncodingApi

@OptIn(ExperimentalEncodingApi::class)
fun testBase64() {
    val text = "Hello Kotlin 2.2"
    
    // 編碼
    val encoded = Base64.encode(text.encodeToByteArray())
    println(encoded)
    
    // 解碼
    val decodedBytes = Base64.decode(encoded)
    println(String(decodedBytes))
}

這對寫 KMP 跨平台專案的人來說是救星。你可以直接在 commonMain 資料夾裡寫編碼邏輯,不用再幫 iOS 和 Android 各自寫一套實作。


開發建議

如果你還在用 2.1.0,建議可以先在 build.gradle 試著改版號。如果出現很多紅色底線,通常是 2.2.0 對於語法規範變得更嚴格。

像是有些隱含的類型轉換或是不規範的泛型用法,2.2.0 都會要求你寫清楚。雖然修起來有點煩,但這能讓你的專案體質更健康,減少執行時期的閃退。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *