< 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,21 +163,11 @@
         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;
-                    }
-                };
+                : new ValueWrapper(rawObservable);
 
         if (!newObservable.equals(observable)) {
             unbind();
             observable = newObservable;
             if (listener == null) {

@@ -194,10 +184,13 @@
     @Override
     public void unbind() {
         if (observable != null) {
             value = observable.get();
             observable.removeListener(listener);
+            if (observable instanceof ValueWrapper) {
+                ((ValueWrapper)observable).dispose();
+            }
             observable = null;
         }
     }
 
     /**

@@ -250,6 +243,26 @@
         @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 >