< prev index next >

modules/base/src/main/java/javafx/beans/property/FloatPropertyBase.java

Print this page
rev 9211 : 8130458: Memory leak in bind/unbind of [Primitive]PropertyBase

*** 169,193 **** ObservableFloatValue newObservable; if (rawObservable instanceof ObservableFloatValue) { newObservable = (ObservableFloatValue)rawObservable; } else if (rawObservable instanceof ObservableNumberValue) { final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable; ! newObservable = new FloatBinding() { ! { ! super.bind(rawObservable); ! } @Override protected float computeValue() { return numberValue.floatValue(); } }; } else { ! newObservable = new FloatBinding() { ! { ! super.bind(rawObservable); ! } @Override protected float computeValue() { final Number value = rawObservable.getValue(); return (value == null)? 0.0f : value.floatValue(); --- 169,187 ---- ObservableFloatValue newObservable; if (rawObservable instanceof ObservableFloatValue) { newObservable = (ObservableFloatValue)rawObservable; } else if (rawObservable instanceof ObservableNumberValue) { final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable; ! newObservable = new ValueWrapper(rawObservable) { @Override protected float computeValue() { return numberValue.floatValue(); } }; } else { ! newObservable = new ValueWrapper(rawObservable) { @Override protected float computeValue() { final Number value = rawObservable.getValue(); return (value == null)? 0.0f : value.floatValue();
*** 213,222 **** --- 207,219 ---- @Override public void unbind() { if (observable != null) { value = observable.get(); observable.removeListener(listener); + if (observable instanceof ValueWrapper) { + ((ValueWrapper)observable).dispose(); + } observable = null; } } /**
*** 269,274 **** --- 266,286 ---- @Override public boolean wasGarbageCollected() { return wref.get() == null; } } + + private abstract class ValueWrapper extends FloatBinding { + + private ObservableValue<? extends Number> observable; + + public ValueWrapper(ObservableValue<? extends Number> observable) { + this.observable = observable; + bind(observable); + } + + @Override + public void dispose() { + unbind(observable); + } + } }
< prev index next >