1. 程式人生 > 其它 >[Kotlin] 懶載入Lazy<T>簡介與應用

[Kotlin] 懶載入Lazy<T>簡介與應用

簡介

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)許可協議 下提供