Kotlin 内置的“懒惰”功能是如何工作的?

Kub*_*a T 2 delegates lazy-initialization kotlin

我想在我的 Kotlin 代码中尝试一些新的委托属性。我在文档中发现,对于自定义委托属性,我需要创建一个具有强制性方法的类 -getValue以及可选的setValue,它们是文档中提到的接口的一部分:

您可以将委托创建为匿名对象,而无需使用接口ReadOnlyPropertyReadWritePropertyKotlin 标准库创建新类

我开始研究 Kotlin 的内置委托函数。我研究了lazy如下函数的实现:

public actual fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)
Run Code Online (Sandbox Code Playgroud)

这就是我的问题所在:为什么它实际上有效? Lazy接口只有value属性和一些确定其值初始化的方法。SynchronizedLazyImpl没有比这更多的了。他们都没有getValuesetValue方法,那么为什么 Kotlin 不抱怨并成功编译?

Apl*_*123 6

查看Lazy 此处的源代码,您可以在第 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
Run Code Online (Sandbox Code Playgroud)

本质上,有一个getValue用于Lazy仅返回value属性的实例的扩展函数。SynchronizedLazyImpl只定义value属性,并getValue自动提供。