< prev index next >
modules/base/src/main/java/javafx/beans/property/DoublePropertyBase.java
Print this page
rev 9211 : 8130458: Memory leak in bind/unbind of [Primitive]PropertyBase
*** 169,193 ****
ObservableDoubleValue newObservable;
if (rawObservable instanceof ObservableDoubleValue) {
newObservable = (ObservableDoubleValue)rawObservable;
} else if (rawObservable instanceof ObservableNumberValue) {
final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable;
! newObservable = new DoubleBinding() {
! {
! super.bind(rawObservable);
! }
@Override
protected double computeValue() {
return numberValue.doubleValue();
}
};
} else {
! newObservable = new DoubleBinding() {
! {
! super.bind(rawObservable);
! }
@Override
protected double computeValue() {
final Number value = rawObservable.getValue();
return (value == null)? 0.0 : value.doubleValue();
--- 169,187 ----
ObservableDoubleValue newObservable;
if (rawObservable instanceof ObservableDoubleValue) {
newObservable = (ObservableDoubleValue)rawObservable;
} else if (rawObservable instanceof ObservableNumberValue) {
final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable;
! newObservable = new ValueWrapper(rawObservable) {
@Override
protected double computeValue() {
return numberValue.doubleValue();
}
};
} else {
! newObservable = new ValueWrapper(rawObservable) {
@Override
protected double computeValue() {
final Number value = rawObservable.getValue();
return (value == null)? 0.0 : value.doubleValue();
*** 212,221 ****
--- 206,218 ----
@Override
public void unbind() {
if (observable != null) {
value = observable.get();
observable.removeListener(listener);
+ if (observable instanceof ValueWrapper) {
+ ((ValueWrapper)observable).dispose();
+ }
observable = null;
}
}
/**
*** 268,273 ****
--- 265,285 ----
@Override
public boolean wasGarbageCollected() {
return wref.get() == null;
}
}
+
+ private abstract class ValueWrapper extends DoubleBinding {
+
+ 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 >