【Kotlin 入門指南】系列文章目錄:https://bit.ly/3t8awwL
Kotlin 線上課程教學影片:https://bit.ly/3qJ5a5Q
在 Kotlin 中,我們使用延遲初始化的關鍵字分別為「lateinit」和「lazy」。它們有助於管理變數的初始化時間,提升程式效能並簡化程式碼撰寫。
在 Kotlin 中,我們使用 lateinit
關鍵字來定義為延遲初始化。它可以在聲明變數時不需要賦初值,並在稍後適當的時候再進行初始化。有用到時,需手動加載。
class MyClass {
// lateinit 不能使用 val 因為之後不能再修改
// lateinit val result: String
lateinit var result: String //lateinit 先定義,稍後在初始化資料值
fun setResult() {
result = "初始化資料成功"
}
fun showResult() {
// 危險寫法
// println("result: $result")
// 縱使寫 null 前置判斷仍然會噴錯,因為只要訪問到未初始化資料就會錯誤
// if (result != null) {
// println("result: $result")
// }
//安全寫法,使用 isInitialized 判斷是否已經初始化
if (::result.isInitialized) {
println("result: $result")
} else {
println("例外:資料尚未初始化")
}
}
}
fun main() {
val myClass = MyClass()
// 會噴錯,因為沒有初始化資料
// myClass.showResult()
// 當今天有用到時,需要先「手動加載」
myClass.setResult()
myClass.showResult()
}
lateinit
只能用於 var 屬性且類型不能為可為空(nullable)。lateinit property not initialized
的異常錯誤。lateinit
。在 Kotlin 中,我們使用 lazy
關鍵字來達到懶加載,用於在第一次訪問時初始化變數。它可以接收一個 lambda 函數作為參數,該 lambda 函數會在變數第一次被訪問時執行並返回初始值。有用到時,會自動加載。
class MyClass {
// 一般方式
// val result = getResultData()
// 懶加載
val result by lazy {
getResultData()
}
private fun getResultData(): String {
println("準備開始下載")
println("資料下載中....")
println("資料下載中....")
println("資料下載中....")
println("下載完成")
return "資料成功下載"
}
}
fun main() {
val myClass = MyClass()
Thread.sleep(3000)
println("result: " + myClass.result)
}
lateinit
適用於需要稍後才能確定初始化值的情況,如在構造函數之後或特定條件下進行初始化。lazy
適用於需要延遲初始化且只會被訪問一次的變數,可以用於昂貴的初始化運算或需要特定時機初始化的情況。