< prev index next >

modules/base/src/main/java/javafx/beans/property/FloatPropertyBase.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         ObservableFloatValue newObservable;
 170         if (rawObservable instanceof ObservableFloatValue) {
 171             newObservable = (ObservableFloatValue)rawObservable;
 172         } else if (rawObservable instanceof ObservableNumberValue) {
 173             final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable;
 174             newObservable = new FloatBinding() {
 175                 {
 176                     super.bind(rawObservable);
 177                 }
 178 
 179                 @Override
 180                 protected float computeValue() {
 181                     return numberValue.floatValue();
 182                 }
 183             };
 184         } else {
 185             newObservable = new FloatBinding() {
 186                 {
 187                     super.bind(rawObservable);
 188                 }
 189 
 190                 @Override
 191                 protected float computeValue() {
 192                     final Number value = rawObservable.getValue();
 193                     return (value == null)? 0.0f : value.floatValue();
 194                 }
 195             };
 196         }
 197 
 198 
 199         if (!newObservable.equals(observable)) {
 200             unbind();
 201             observable = newObservable;
 202             if (listener == null) {
 203                 listener = new Listener(this);
 204             }
 205             observable.addListener(listener);
 206             markInvalid();
 207         }
 208     }
 209 
 210     /**
 211      * {@inheritDoc}
 212      */
 213     @Override
 214     public void unbind() {
 215         if (observable != null) {
 216             value = observable.get();
 217             observable.removeListener(listener);



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


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















 272         }
 273     }
 274 }


 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         ObservableFloatValue newObservable;
 170         if (rawObservable instanceof ObservableFloatValue) {
 171             newObservable = (ObservableFloatValue)rawObservable;
 172         } else if (rawObservable instanceof ObservableNumberValue) {
 173             final ObservableNumberValue numberValue = (ObservableNumberValue)rawObservable;
 174             newObservable = new ValueWrapper(rawObservable) {



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



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


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