У меня есть класс Java, который содержит прослушиватели, использующие слабые ссылки. Когда я передаю лямбды Kotlin в качестве слушателей, они удаляются сборщиком мусора, хотя вызывающая сторона все еще содержит ссылку на них. Однако если я передаю обычный объект Kotlin вместо лямбды, такого поведения не произойдет.
Почему это происходит? Ожидается ли такое поведение в Котлине?
companion object {
// This lambda IS being garbage collected after a while
val aLambda: (bundle: Bundle?, caller: Fragment?) -> Unit = { _, _ -> if (something()) processRequest() }
// This object IS NOT being garbage collected
val anObject = object: Notifications.Listener {
override fun onNotification(bundle: Bundle?, caller: Fragment?) {
if (something()) processRequest()
}
}
init {
// This Notifications class holds weak references to both the lambda & object the same way
Notifications.addListener(aLambda)
Notifications.addListener(anObject)
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... bject-isnt