Here is an example from Kishori Sharan's Learn JavaFX 8 book:
package sample;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.beans.value.WeakChangeListener;
public class WeakListener {
public static IntegerProperty counter = new SimpleIntegerProperty(100);
public static WeakChangeListener<Number> weakListener;
public static ChangeListener<Number> changeListener;
public static void main(String[] args) {
// Add a weak change listener to the property
addWeakListener();
counter.set(300);
System.gc();
System.out.println("Garbage collected: " +
weakListener.wasGarbageCollected());
counter.set(400);
changeListener = null;
System.gc();
System.out.println("Garbage collected: " +
weakListener.wasGarbageCollected());
counter.set(500);
}
public static void addWeakListener() {
changeListener = WeakListener::changed;
weakListener = new WeakChangeListener<>(changeListener);
counter.addListener(weakListener);
counter.set(200);
}
public static void changed(ObservableValue<? extends Number> prop,
Number oldValue,
Number newValue) {
System.out.print("Counter changed: ");
System.out.println("old = " + oldValue + ", new = " + newValue);
}
}
The weak listener is supposed to be GCed after the strong listener is set to null:
but the result is not as expected:
Counter changed: old = 100, new = 200
Counter changed: old = 200, new = 300
Garbage collected: false
Counter changed: old = 300, new = 400
Garbage collected: false
Counter changed: old = 400, new = 500
I am using jdk 1.8_u51 on OSX yosemite.