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() -> ... })、非局部break與continue、以及多個$符號的字串模板,在 2.2.0 都變成了正式穩定版。 - 預設介面方法 (JVM):2.2.0 改變了 JVM 上的編譯方式。現在介面中的預設方法會直接編譯成 Java 的
default方法,不再產生額外的DefaultImpls類別,這讓 Kotlin 與 Java 的交互更自然,字節碼也更簡潔。 - 標準庫加強:2.2.0 正式引入了穩定的
Base64和HexFormatAPI,以後處理編碼就不需要再找第三方函式庫或依賴特定平台。 - 上下文參數 (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 都會要求你寫清楚。雖然修起來有點煩,但這能讓你的專案體質更健康,減少執行時期的閃退。