В Kotlin, если у вас есть класс open
, который ссылается на this
в его конструкторе или init
блоке, вы (совершенно справедливо) получаете предупреждение компилятора:
Утечка '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")
}
}
Использование этих объектов следующим образом:
Leaker(Listener())
приведет к следующему выводу:
Listener hears that leaker created with a value of 0
Leaker knows that it's been created with a value of 1
Обратите внимание, что myVal
первоначально сообщается как 0, затем как 1.
Как видно, Leaker
передает свой экземпляр в Listener
до того, как Leaker
будет полностью построен.Listener
может получить доступ к свойству myVal
до его инициализации, поэтому у него будет значение по умолчанию (в данном случае 0, так как это целое число).Позже Listener
затем изменяет значение этого свойства (на 1 в этом примере).Это означает, что программа ведет себя так, как будто val
изменился.
Должен ли компилятор предупредить вас об этом?