为什么 Kotlin 的内置 "lazy" 函数真的有效?
How come Kotlin's built-in "lazy" function actually works?
我想在我的 Kotlin 代码中尝试一些新的委托属性。我在文档中发现,对于自定义委托属性,我需要使用强制方法创建 class - getValue
和可选的 setValue
,它们是文档中提到的接口的一部分:
You can create delegates as anonymous objects without creating new classes using the interfaces ReadOnlyProperty
and ReadWriteProperty
from the Kotlin standard library
我开始研究 Kotlin 的内置委托函数。我研究了 lazy
函数的实现,如下所示:
public actual fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)
这就是我的问题所在:为什么它真的有效? Lazy
接口只有 value
属性 和一些方法确定它的值的初始化。 SynchronizedLazyImpl
仅此而已。 None 其中有 getValue
或 setValue
方法,那么为什么 Kotlin 不报错并编译成功?
查看 Lazy
here 的源代码,您可以在第 37 行看到以下内容:
/**
* An extension to delegate a read-only property of type [T] to an instance of [Lazy].
*
* This extension allows to use instances of Lazy for property delegation:
* `val property: String by lazy { initializer }`
*/
@kotlin.internal.InlineOnly
public inline operator fun <T> Lazy<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value
本质上,Lazy
实例有一个 getValue
扩展函数,只是 returns value
属性。 SynchronizedLazyImpl
只是定义了value
属性,getValue
是自动提供的。
我想在我的 Kotlin 代码中尝试一些新的委托属性。我在文档中发现,对于自定义委托属性,我需要使用强制方法创建 class - getValue
和可选的 setValue
,它们是文档中提到的接口的一部分:
You can create delegates as anonymous objects without creating new classes using the interfaces
ReadOnlyProperty
andReadWriteProperty
from the Kotlin standard library
我开始研究 Kotlin 的内置委托函数。我研究了 lazy
函数的实现,如下所示:
public actual fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)
这就是我的问题所在:为什么它真的有效? Lazy
接口只有 value
属性 和一些方法确定它的值的初始化。 SynchronizedLazyImpl
仅此而已。 None 其中有 getValue
或 setValue
方法,那么为什么 Kotlin 不报错并编译成功?
查看 Lazy
here 的源代码,您可以在第 37 行看到以下内容:
/**
* An extension to delegate a read-only property of type [T] to an instance of [Lazy].
*
* This extension allows to use instances of Lazy for property delegation:
* `val property: String by lazy { initializer }`
*/
@kotlin.internal.InlineOnly
public inline operator fun <T> Lazy<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value
本质上,Lazy
实例有一个 getValue
扩展函数,只是 returns value
属性。 SynchronizedLazyImpl
只是定义了value
属性,getValue
是自动提供的。