这个引用在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:如何在事务类的上下文中运行服务方法?
  • 用Kotlin抛出异常
  • 如何检查kotlin中的“instanceof”类?
  • 需要Kotlin函数什么都不是,而是定义为一个不同的types
  • Kotlin:创建扩展函数文件?加
  • 检查我的活动是否在MultiWindowMode或不使用Kotlin
  • 如何扩展Kotlin Number类或使用泛型来创建一个简单的属性getter,它将在所有的Nu​​mber子类上运行?
  • 在V1.0.1中不能识别Kotlin扩展属性
  • kotlin是功能性的还是程序性的?
  • 在android java类中使用Kotlin扩展
  • 在android java类中使用Kotlin扩展
  • Kotlin language will be the best programming language for Android.