【Kotlin 入門指南】lateinit & lazy 使用範例與介紹

2023/12/15閱讀時間約 5 分鐘
【Kotlin 入門指南】系列文章目錄:https://bit.ly/3t8awwL
Kotlin 線上課程教學影片:https://bit.ly/3qJ5a5Q

lateinit & lazy

在 Kotlin 中,我們使用延遲初始化的關鍵字分別為「lateinit」和「lazy」。它們有助於管理變數的初始化時間,提升程式效能並簡化程式碼撰寫。

延遲初始化:lateinit

在 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 特性

  1. 僅適用於非空類型lateinit 只能用於 var 屬性且類型不能為可為空(nullable)。
  2. 必須在使用前初始化:否則會拋出 lateinit property not initialized 的異常錯誤。
  3. 僅適用於類成員變數和頂層變數:無法在局部變數使用 lateinit

懶加載:lazy

在 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 差異

  • lateinit 適用於需要稍後才能確定初始化值的情況,如在構造函數之後或特定條件下進行初始化。
  • lazy 適用於需要延遲初始化且只會被訪問一次的變數,可以用於昂貴的初始化運算或需要特定時機初始化的情況。

餓漢式 & 懶漢式初始化方式比較

  • 餓漢式:不管餓不餓都先叫 100 份 pizza。提前先消耗佔住記憶體,但可能一輩子也不會用到。
  • 懶漢式:今天肚子餓了才叫 pizza。有需要時才去創建實體化。有效的利用記憶體空間,不會造成不必要的記憶體消耗。
3會員
176內容數
本指南將以清晰易懂的方式介紹基礎概念,讓你能夠快速上手,輕鬆踏上學習 Kotlin 的旅程 透過簡單易懂的方式,讓你將能夠在短時間內建立起對 Kotlin 的基本了解,並開始實際應用於你的專案之中。不論你是想要進入 Android 開發領域或者只是想探索新的程式語言,這份指南都會成為你學習 Kotlin 的理想起點。
留言0
查看全部
發表第一個留言支持創作者!