我正在尝试Kotlin并希望为Activity实现一个延迟扩展属性:
/** * Activity module */ val Activity.activityModule: ActivityModule by lazy { ActivityModule(this) }
编译器错误:
'this' is not defined in this context
我怎样才能将此作为活动资格?我已经阅读了指南,但无法得到它.this@Activity
说这个参考没有得到解决.
这里的其他答案指出,不可能this
在stdlib当前的lazy
接收器实现中引用,并且可以实现自己的委托.所以我决定实现它并在这里发布...:
class LazyWithReceiver(val initializer:This.()->Return) { private val values = WeakHashMap () @Suppress("UNCHECKED_CAST") operator fun getValue(thisRef:Any,property:KProperty<*>):Return = synchronized(values) { thisRef as This return values.getOrPut(thisRef) {thisRef.initializer()} } }
以下是一些显示如何使用它的代码.
这个实现使用弱哈希映射为每个接收器存储一个单独的值...这带来了几个含义...:
结构相等的不同实例将共享相同的值.
在某些情况下,已经为某些接收器初始化的值可能是垃圾收集的,这意味着如果再次访问初始化器,则可能会再次调用初始化器来重新初始化该值.