Kub*_*a T 2 delegates lazy-initialization kotlin
我想在我的 Kotlin 代码中尝试一些新的委托属性。我在文档中发现,对于自定义委托属性,我需要创建一个具有强制性方法的类 -getValue以及可选的setValue,它们是文档中提到的接口的一部分:
您可以将委托创建为匿名对象,而无需使用接口
ReadOnlyProperty和ReadWritePropertyKotlin 标准库创建新类
我开始研究 Kotlin 的内置委托函数。我研究了lazy如下函数的实现:
public actual fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)
Run Code Online (Sandbox Code Playgroud)
这就是我的问题所在:为什么它实际上有效? Lazy接口只有value属性和一些确定其值初始化的方法。SynchronizedLazyImpl没有比这更多的了。他们都没有getValue或setValue方法,那么为什么 Kotlin 不抱怨并成功编译?
查看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自动提供。
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |