这个引用在kotlin扩展属性的lazy初始值设定中

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

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

编译器错误与:

 'this' is not defined in this context 

我怎样才能把这个作为Activity这个? 我已阅读指南,但无法得到它。 this@Activity说参考是未解决的。

4 Solutions collect form web for “这个引用在kotlin扩展属性的lazy初始值设定中”

Kotlin中的lazy委托没有引用属性成员类。

我看到两个解决方案:

  1. 将其转换为扩展功能
  2. 实施自己的委托

当第一次访问时, lazy调用initializer函数,然后存储initializer程序返回的值,以便在连续访问时返回该值。

Lazy一个实例能够存储恰好一个值。 当你将扩展属性委托给一个Lazy实例的时候,你会从接收者类型的所有实例中获得一个Lazy服务getValue请求的实例,在你的情况下它是Activity 。 这会导致只计算第一个“ Activity Lazy计算”值,并在其他所有“ Activity实例的后续调用中使用该值。

因此,尽管在语法上可以将一个Activity作为接收者传递给初始值设定项,并按照@voddan的建议将其引用为里面,但Lazy本身不能为不同的接收者存储不同的值。

具有扩展属性的外部存储的能力可能会被“附加属性”功能KT-7210覆盖。 我不认为Lazy应该有这个能力,因为它使其实施复杂化。

这里的其他答案指出,在stdlib的lazy接收器的当前实现中不可能引用它,并且可以实现它们自己的委托。 所以我决定实施它,并把它张贴在这里:

 class LazyWithReceiver<This,Return>(val initializer:This.()->Return) { private val values = WeakHashMap<This,Return>() @Suppress("UNCHECKED_CAST") operator fun getValue(thisRef:Any,property:KProperty<*>):Return = synchronized(values) { thisRef as This return values.getOrPut(thisRef) {thisRef.initializer()} } } 

这里有一些代码显示如何使用它。

这个实现使用一个弱哈希映射来为每个接收者存储一个单独的值…这带来了一些暗示……:

  • 结构相同的不同实例将具有相同的价值。

  • 在某些情况下,已经为某个接收者初始化的值可能被垃圾收集,这意味着如果再次访问初始值设定项,可能会再次调用初始值。

我认为没有办法从lazy的身体访问Activity ,至少用当前签名\执行: fun <T> lazy(initializer: () -> T): Lazy<T>

要做到这一点,签名必须看起来像

 fun <A, T> lazy(initializer: A.() -> T): Lazy2<A, T> 

你可以自己实现这样一个扩展函数,或者用stdlib报告这个问题

  • Kotlin泛型期待意想不到的类型
  • 在android java类中使用Kotlin扩展
  • Kotlins扩展方法Stream.toList()丢失
  • 受保护的成员无法通过扩展功能访问?
  • 创建Kotlin对象的新实例
  • 任何如何在Maven依赖关系中启用Kotlin扩展函数的例子?
  • Kotlin扩展通用函数与基本类型没有反射API
  • Android Studio和Kotlin:未解决的参考:也
  • 如何在同一个src文件夹中运行不同的.kt文件/类?
  • Android库不能编译kotlin
  • 点击一个文本视图来改变片段
  • Kotlin language will be the best programming language for Android.