[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