当前位置:  开发笔记 > 编程语言 > 正文

这个引用在kotlin扩展属性的惰性初始化器中

如何解决《这个引用在kotlin扩展属性的惰性初始化器中》经验,为你挑选了1个好方法。

我正在尝试Kotlin并希望为Activity实现一个延迟扩展属性:

/**
 * Activity module
 */
val Activity.activityModule: ActivityModule by lazy {
    ActivityModule(this)
}

编译器错误:

'this' is not defined in this context

我怎样才能将此作为活动资格?我已经阅读了指南,但无法得到它.this@Activity说这个参考没有得到解决.



1> Eric..:

这里的其他答案指出,不可能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()}
    }
}

以下是一些显示如何使用它的代码.

这个实现使用弱哈希映射为每个接收器存储一个单独的值...这带来了几个含义...:

结构相等的不同实例将共享相同的值.

在某些情况下,已经为某些接收器初始化的值可能是垃圾收集的,这意味着如果再次访问初始化器,则可能会再次调用初始化器来重新初始化该值.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有