< prev index next >

modules/base/src/main/java/javafx/beans/property/IntegerPropertyBase.java

Print this page
rev 9211 : 8130458: Memory leak in bind/unbind of [Primitive]PropertyBase

@@ -169,25 +169,19 @@
         ObservableIntegerValue newObservable;
         if (rawObservable instanceof ObservableIntegerValue) {
             newObservable = (ObservableIntegerValue)rawObservable;
         } else if (rawObservable instanceof ObservableNumberValue) {
             final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable;
-            newObservable = new IntegerBinding() {
-                {
-                    super.bind(rawObservable);
-                }
+            newObservable = new ValueWrapper(rawObservable) {
 
                 @Override
                 protected int computeValue() {
                     return numberValue.intValue();
                 }
             };
         } else {
-            newObservable = new IntegerBinding() {
-                {
-                    super.bind(rawObservable);
-                }
+            newObservable = new ValueWrapper(rawObservable) {
 
                 @Override
                 protected int computeValue() {
                     final Number value = rawObservable.getValue();
                     return (value == null)? 0 : value.intValue();

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

@@ -268,6 +265,21 @@
         @Override
         public boolean wasGarbageCollected() {
             return wref.get() == null;
         }
     }
+
+    private abstract class ValueWrapper extends IntegerBinding {
+
+        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 >