小编Nah*_*ela的帖子

“在构造函数中泄漏‘this’”警告应该适用于最终类和开放类吗?

在 Kotlin 中,如果您有一个在其构造函数或块中open引用的类,您(非常正确)会收到编译器警告:thisinit

在非最终类的构造函数中泄漏“this”

原因在此处解释。

我的问题是:为什么在班级结束时报告这一点?如果this在该init块完成之前在该块中使用,则该对象仍未处于完全构造状态,所以警告不应该也适用于那里吗?

这甚至可能导致val属性似乎在运行时发生变化的情况。以这段代码为例:

class Listener {
    fun onCreated(leaker: Leaker) = println("Listener hears that leaker created with a value of ${leaker.myVal}")
}

class Leaker(listener: Listener) {
    val myVal: Int

    init {
        listener.onCreated(this)
        myVal = 1
        println("Leaker knows that it's been created with a value of $myVal")
    }
}
Run Code Online (Sandbox Code Playgroud)

使用这些对象如下:

Leaker(Listener())
Run Code Online (Sandbox Code Playgroud)

将导致以下输出:

Listener hears that leaker created with a value of 0
Leaker knows …
Run Code Online (Sandbox Code Playgroud)

kotlin

20
推荐指数
1
解决办法
9526
查看次数

标签 统计

kotlin ×1