[PATCH] 8130458 : BooleanBinding binding/unbinding leaks
Jesper Skov
jskov at zoftcorp.dk
Sun Jul 19 08:20:08 UTC 2015
Hi,
I had a look quick look around in the bugs lists for something to try
fixing. I happened on this issue.
I am aware that the other primitive binding classes should have similar
treatment.
But I wanted to get approval/hints before continuing.
The change adds a new inner class that allows the wrapped binding to be
unbound when the parent is.
There is no test (hard to test presence/absence of a leak).
Thanks,
Jesper
-------------- next part --------------
diff --git a/modules/base/src/main/java/javafx/beans/property/BooleanPropertyBase.java b/modules/base/src/main/java/javafx/beans/property/BooleanPropertyBase.java
--- a/modules/base/src/main/java/javafx/beans/property/BooleanPropertyBase.java
+++ b/modules/base/src/main/java/javafx/beans/property/BooleanPropertyBase.java
@@ -164,17 +164,7 @@
}
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;
- }
- };
+ : new WrappedBooleanBinding(rawObservable);
if (!newObservable.equals(observable)) {
unbind();
@@ -195,6 +185,9 @@
if (observable != null) {
value = observable.get();
observable.removeListener(listener);
+ if (observable instanceof WrappedBooleanBinding) {
+ ((WrappedBooleanBinding)observable).unbind();
+ }
observable = null;
}
}
@@ -228,6 +221,25 @@
return result.toString();
}
+ private static class WrappedBooleanBinding extends BooleanBinding {
+ final ObservableValue<? extends Boolean> rawObservable;
+ WrappedBooleanBinding(final ObservableValue<? extends Boolean> rawObservable) {
+ super.bind(rawObservable);
+
+ this.rawObservable = rawObservable;
+ }
+
+ @Override
+ protected boolean computeValue() {
+ final Boolean value = rawObservable.getValue();
+ return (value == null)? false : value;
+ }
+
+ protected void unbind() {
+ super.unbind(rawObservable);
+ }
+ };
+
private static class Listener implements InvalidationListener {
private final WeakReference<BooleanPropertyBase> wref;
More information about the openjfx-dev
mailing list