by lazy 延遲初始化
延遲初始化(Lazy Initialization)
語法
val 變數 by lazy {
...
傳回值
}
- 傳回值是設定變數的內容。
所謂的lazy是指,當要使用時才初始化變數的內容,而且只會初始化一次,記憶體就會記錄變數的值。
1
2
3
4
5
6
7
8
val lazyValue:String by lazy {
println("設值並初始化")
"Hello"
}
fun main() {
println(lazyValue)
println(lazyValue)
}
設值並初始化
Hello
Hello
以上的程式碼,讀取 lazyValue 變數二次,但只有第一次有執行println("設值並初始化"),接下來把Hello儲存在lazyValue的變數中,變數是建立在記憶體中的某一個空間。
第二次使用的時候,直接讀取記憶體中存放的值。
程式碼
1
2
3
4
5
6
7
8
class Test {
// 使用的時候,才初始化變數
val info by lazy { load() }
private fun load(): String {
println("load setting")
return "infomation"
}
}
以下程式碼,建立Test物件時,並不會初始化info 屬性,直到使用變數,才呼叫load()函式,並傳回infomation,把info屬性的值設為infomation。
1
2
3
4
5
6
7
fun main() {
val test: Test = Test()
// 暫停3秒
Thread.sleep(3000)
// 3秒後才使用這個變數,使用的時候才初始化變數內容
println(test.info)
}
load setting
infomation
lazy的概念有點像Java的靜態內部類別