Почему лямбда-выражение Kotlin собирается мусором, а объект — нет?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему лямбда-выражение Kotlin собирается мусором, а объект — нет?

Сообщение Anonymous »

У меня есть класс Java, который содержит прослушиватели, использующие слабые ссылки. Когда я передаю лямбды Kotlin в качестве прослушивателей, метод слабой ссылки get() возвращает значение null. Я подозреваю, что объекты подвергаются сборке мусора, хотя вызывающая сторона все еще содержит ссылку на них. Однако если я передаю обычный объект Kotlin вместо лямбды, такого поведения не произойдет.
  • Почему это происходит?
  • Это ожидаемое поведение 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)
}
}

Код Java:
public class Notifications {

private static ArrayList listenersArray = new ArrayList();

public static void addListener(@NonNull Listener listener) {
listenersArray.add(new WeakReference(listener));
}

public static void notify(@Nullable Bundle bundle, @Nullable Fragment caller) {
for (WeakReference weakListener : listenersArray) {
Listener listener = weakListener.get();
if (listener != null) {
listener.onNotification(bundle, caller);
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... bject-isnt
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»