< prev index next >
modules/base/src/main/java/javafx/beans/property/BooleanPropertyBase.java
Print this page
rev 9211 : 8130458: Memory leak in bind/unbind of [Primitive]PropertyBase
*** 163,183 ****
if (rawObservable == null) {
throw new NullPointerException("Cannot bind to null");
}
final ObservableBooleanValue newObservable = (rawObservable instanceof ObservableBooleanValue) ? (ObservableBooleanValue) rawObservable
! : new BooleanBinding() {
! {
! super.bind(rawObservable);
! }
!
! @Override
! protected boolean computeValue() {
! final Boolean value = rawObservable.getValue();
! return (value == null)? false : value;
! }
! };
if (!newObservable.equals(observable)) {
unbind();
observable = newObservable;
if (listener == null) {
--- 163,173 ----
if (rawObservable == null) {
throw new NullPointerException("Cannot bind to null");
}
final ObservableBooleanValue newObservable = (rawObservable instanceof ObservableBooleanValue) ? (ObservableBooleanValue) rawObservable
! : new ValueWrapper(rawObservable);
if (!newObservable.equals(observable)) {
unbind();
observable = newObservable;
if (listener == null) {
*** 194,203 ****
--- 184,196 ----
@Override
public void unbind() {
if (observable != null) {
value = observable.get();
observable.removeListener(listener);
+ if (observable instanceof ValueWrapper) {
+ ((ValueWrapper)observable).dispose();
+ }
observable = null;
}
}
/**
*** 250,255 ****
--- 243,268 ----
@Override
public boolean wasGarbageCollected() {
return wref.get() == null;
}
}
+
+ private class ValueWrapper extends BooleanBinding {
+ private ObservableValue<? extends Boolean> observable;
+
+ public ValueWrapper(ObservableValue<? extends Boolean> observable) {
+ this.observable = observable;
+ bind(observable);
+ }
+
+ @Override
+ protected boolean computeValue() {
+ final Boolean value = observable.getValue();
+ return (value == null) ? false : value;
+ }
+
+ @Override
+ public void dispose() {
+ unbind(observable);
+ }
+ }
}
< prev index next >