< prev index next >

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

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


 154      */
 155     @Override
 156     public boolean isBound() {
 157         return observable != null;
 158     }
 159 
 160     /**
 161      * {@inheritDoc}
 162      */
 163     @Override
 164     public void bind(final ObservableValue<? extends Number> rawObservable) {
 165         if (rawObservable == null) {
 166             throw new NullPointerException("Cannot bind to null");
 167         }
 168 
 169         ObservableDoubleValue newObservable;
 170         if (rawObservable instanceof ObservableDoubleValue) {
 171             newObservable = (ObservableDoubleValue)rawObservable;
 172         } else if (rawObservable instanceof ObservableNumberValue) {
 173             final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable;
 174             newObservable = new DoubleBinding() {
 175                 {
 176                     super.bind(rawObservable);
 177                 }
 178 
 179                 @Override
 180                 protected double computeValue() {
 181                     return numberValue.doubleValue();
 182                 }
 183             };
 184         } else {
 185             newObservable = new DoubleBinding() {
 186                 {
 187                     super.bind(rawObservable);
 188                 }
 189 
 190                 @Override
 191                 protected double computeValue() {
 192                     final Number value = rawObservable.getValue();
 193                     return (value == null)? 0.0 : value.doubleValue();
 194                 }
 195             };
 196         }
 197 
 198         if (!newObservable.equals(observable)) {
 199             unbind();
 200             observable = newObservable;
 201             if (listener == null) {
 202                 listener = new Listener(this);
 203             }
 204             observable.addListener(listener);
 205             markInvalid();
 206         }
 207     }
 208 
 209     /**
 210      * {@inheritDoc}
 211      */
 212     @Override
 213     public void unbind() {
 214         if (observable != null) {
 215             value = observable.get();
 216             observable.removeListener(listener);



 217             observable = null;
 218         }
 219     }
 220 
 221     /**
 222      * Returns a string representation of this {@code DoublePropertyBase} object.
 223      * @return a string representation of this {@code DoublePropertyBase} object.
 224      */
 225     @Override
 226     public String toString() {
 227         final Object bean = getBean();
 228         final String name = getName();
 229         final StringBuilder result = new StringBuilder("DoubleProperty [");
 230         if (bean != null) {
 231             result.append("bean: ").append(bean).append(", ");
 232         }
 233         if ((name != null) && (!name.equals(""))) {
 234             result.append("name: ").append(name).append(", ");
 235         }
 236         if (isBound()) {


 251 
 252         private final WeakReference<DoublePropertyBase> wref;
 253 
 254         public Listener(DoublePropertyBase ref) {
 255             this.wref = new WeakReference<>(ref);
 256         }
 257 
 258         @Override
 259         public void invalidated(Observable observable) {
 260             DoublePropertyBase ref = wref.get();
 261             if (ref == null) {
 262                 observable.removeListener(this);
 263             } else {
 264                 ref.markInvalid();
 265             }
 266         }
 267 
 268         @Override
 269         public boolean wasGarbageCollected() {
 270             return wref.get() == null;















 271         }
 272     }
 273 }


 154      */
 155     @Override
 156     public boolean isBound() {
 157         return observable != null;
 158     }
 159 
 160     /**
 161      * {@inheritDoc}
 162      */
 163     @Override
 164     public void bind(final ObservableValue<? extends Number> rawObservable) {
 165         if (rawObservable == null) {
 166             throw new NullPointerException("Cannot bind to null");
 167         }
 168 
 169         ObservableDoubleValue newObservable;
 170         if (rawObservable instanceof ObservableDoubleValue) {
 171             newObservable = (ObservableDoubleValue)rawObservable;
 172         } else if (rawObservable instanceof ObservableNumberValue) {
 173             final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable;
 174             newObservable = new ValueWrapper(rawObservable) {



 175 
 176                 @Override
 177                 protected double computeValue() {
 178                     return numberValue.doubleValue();
 179                 }
 180             };
 181         } else {
 182             newObservable = new ValueWrapper(rawObservable) {



 183 
 184                 @Override
 185                 protected double computeValue() {
 186                     final Number value = rawObservable.getValue();
 187                     return (value == null)? 0.0 : value.doubleValue();
 188                 }
 189             };
 190         }
 191 
 192         if (!newObservable.equals(observable)) {
 193             unbind();
 194             observable = newObservable;
 195             if (listener == null) {
 196                 listener = new Listener(this);
 197             }
 198             observable.addListener(listener);
 199             markInvalid();
 200         }
 201     }
 202 
 203     /**
 204      * {@inheritDoc}
 205      */
 206     @Override
 207     public void unbind() {
 208         if (observable != null) {
 209             value = observable.get();
 210             observable.removeListener(listener);
 211             if (observable instanceof ValueWrapper) {
 212                 ((ValueWrapper)observable).dispose();
 213             }
 214             observable = null;
 215         }
 216     }
 217 
 218     /**
 219      * Returns a string representation of this {@code DoublePropertyBase} object.
 220      * @return a string representation of this {@code DoublePropertyBase} object.
 221      */
 222     @Override
 223     public String toString() {
 224         final Object bean = getBean();
 225         final String name = getName();
 226         final StringBuilder result = new StringBuilder("DoubleProperty [");
 227         if (bean != null) {
 228             result.append("bean: ").append(bean).append(", ");
 229         }
 230         if ((name != null) && (!name.equals(""))) {
 231             result.append("name: ").append(name).append(", ");
 232         }
 233         if (isBound()) {


 248 
 249         private final WeakReference<DoublePropertyBase> wref;
 250 
 251         public Listener(DoublePropertyBase ref) {
 252             this.wref = new WeakReference<>(ref);
 253         }
 254 
 255         @Override
 256         public void invalidated(Observable observable) {
 257             DoublePropertyBase ref = wref.get();
 258             if (ref == null) {
 259                 observable.removeListener(this);
 260             } else {
 261                 ref.markInvalid();
 262             }
 263         }
 264 
 265         @Override
 266         public boolean wasGarbageCollected() {
 267             return wref.get() == null;
 268         }
 269     }
 270 
 271     private abstract class ValueWrapper extends DoubleBinding {
 272 
 273         private ObservableValue<? extends Number> observable;
 274 
 275         public ValueWrapper(ObservableValue<? extends Number> observable) {
 276             this.observable = observable;
 277             bind(observable);
 278         }
 279 
 280         @Override
 281         public void dispose() {
 282             unbind(observable);
 283         }
 284     }
 285 }
< prev index next >