在没有 getValue 和 setValue 的情况下,Kotlin 的“惰性”实现如何工作?
How does Kotlin's `lazy` implementation work without getValue and setValue?
在具有预设自定义 get/set 行为的 Kotlin 属性中,使用 delegated properties 实现。根据文档,属性 的委托只是具有 getValue
和 setValue
方法的 class
但是当我往里看时the implementation of lazy
,我只发现了value
属性。所以我自己尝试以这种方式实现委托。它编译失败,因为 getValue
和 setValue
没有明确实现。那么lazy
的官方实现是如何工作的呢?
getValue
在所有 Lazy<T>
上声明为扩展函数(是的,它也有效!):
public inline operator fun <T> Lazy<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value
如您所见,它 returns value
,这正是您所期望的。
没有setValue
,没关系。这只是意味着您不能将 lazy { ... }
用作 var
的 属性 委托,而且您确实不能:
var foo by lazy { 10 } // compiler error
毕竟这也没什么意义
在具有预设自定义 get/set 行为的 Kotlin 属性中,使用 delegated properties 实现。根据文档,属性 的委托只是具有 getValue
和 setValue
方法的 class
但是当我往里看时the implementation of lazy
,我只发现了value
属性。所以我自己尝试以这种方式实现委托。它编译失败,因为 getValue
和 setValue
没有明确实现。那么lazy
的官方实现是如何工作的呢?
getValue
在所有 Lazy<T>
上声明为扩展函数(是的,它也有效!):
public inline operator fun <T> Lazy<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value
如您所见,它 returns value
,这正是您所期望的。
没有setValue
,没关系。这只是意味着您不能将 lazy { ... }
用作 var
的 属性 委托,而且您确实不能:
var foo by lazy { 10 } // compiler error
毕竟这也没什么意义