[Kotlin] 懶載入Lazy<T>簡介與應用
阿新 • • 發佈:2021-12-31
簡介
Lazy<T>的原始碼
介面
public interface Lazy<out T> {
public val value: T
public fun isInitialized(): Boolean
}
一種實現
internal class UnsafeLazyImpl<out T>(initializer: () -> T) : Lazy<T>, Serializable { private var initializer: (() -> T)? = initializer private var _value: Any? = UNINITIALIZED_VALUE override val value: T get() { if (_value === UNINITIALIZED_VALUE) { _value = initializer!!() initializer = null } @Suppress("UNCHECKED_CAST") return _value as T } override fun isInitialized(): Boolean = _value !== UNINITIALIZED_VALUE
可以看出,基本原理就是在第一次取值的時候呼叫initializer函式獲得其值,並存儲以備下次使用
應用
最簡單的方式是呼叫lazy函式,它接收一個 ()->T 的引數
然後通過.value屬性(getValue)來獲得值
val x :Lazy<Int> = lazy { -> readln().toInt() }
println("lazy done");
println(x.value);
結果為先輸出"lazy done"再要求輸入
使用語法糖
val x by lazy { readln().toInt() } println("lazy done") println(x)
至於by的用法,涉及委託模式
Copyright 2021 Winterreisender.
文字內容除另有宣告外,均在 知識共享 署名-非商業性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)許可協議 下提供