在 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 ×1