Warum wird ein Kotlin-Lambda im Müll gesammelt, ein Objekt hingegen nicht?Java

Java-Forum
Guest
 Warum wird ein Kotlin-Lambda im Müll gesammelt, ein Objekt hingegen nicht?

Post by Guest »

Ich habe eine Java-Klasse, die Listener mithilfe schwacher Referenzen hält. Wenn ich Kotlin-Lambdas als Listener übergebe, gibt die schwache Referenzmethode get() null zurück. Ich vermute, dass die Objekte im Müll gesammelt werden, obwohl der Aufrufer immer noch einen Verweis auf sie hat. Wenn ich jedoch ein reguläres Kotlin-Objekt anstelle eines Lambda übergebe, tritt dieses Verhalten nicht auf.
  • Warum passiert das?
  • Ist dies das erwartete Verhalten in Kotlin?
Kotlin-Code:

Code: Select all

 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-Code:

Code: Select all

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);
}
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post