Hi Richard,

Coming back to this old thread and now that we are using lamdas all over
I guess we could take one more look into that.

I've prototyped an initial version by introducing a new internal type
named InvalidatedSimpleObjectProperty (not the best name ever!) - see
code pasted below.

And now one can write code like this:

>     public final ObjectProperty<Rectangle2D> viewportProperty() {
>         if (viewport == null) {
>             viewport = new InvalidatedSimpleObjectProperty<>(this, 
> "viewport", (o) -> {
>               invalidateWidthHeight();
>                 impl_markDirty(DirtyBits.NODE_VIEWPORT);
>                 impl_geomChanged();
>             } );
>         }
>         return viewport;
>     }

instead of

>     public final ObjectProperty<Rectangle2D> viewportProperty() {
>         if (viewport == null) {
>             viewport = new ObjectPropertyBase<Rectangle2D>() {
> 
>                 @Override
>                 protected void invalidated() {
>                     invalidateWidthHeight();
>                     impl_markDirty(DirtyBits.NODE_VIEWPORT);
>                     impl_geomChanged();
>                 }
> 
>                 @Override
>                 public Object getBean() {
>                     return ImageView.this;
>                 }
> 
>                 @Override
>                 public String getName() {
>                     return "viewport";
>                 }
>             };
>         }
>         return viewport;
>     }

Which allows us to get rid of most of the ObjectPropertyBase sublcasses.

Tom


> package com.sun.javafx.property;
> 
> import java.util.function.Consumer;
> 
> import javafx.beans.property.SimpleObjectProperty;
> 
> public final class InvalidatedSimpleObjectProperty<T> extends 
> SimpleObjectProperty<T> {
>       private final Consumer<InvalidatedSimpleObjectProperty<T>> 
> invalidationConsumer;
>       
>     /**
>      * The constructor of {@code ObjectProperty}
>      * 
>      * @param initialValue
>      *            the initial value of the wrapped value
>      * @param invalidationConsumer
>      *                          the consumer to be called when the bean is 
> invalidated
>      */
>     public InvalidatedSimpleObjectProperty(T initialValue, final 
> Consumer<InvalidatedSimpleObjectProperty<T>> invalidationConsumer) {
>         super(initialValue);
>         if( invalidationConsumer == null ) {
>               throw new IllegalArgumentException("Consumer can not be null");
>         }
>         this.invalidationConsumer = invalidationConsumer;
>     }
> 
>     /**
>      * The constructor of {@code ObjectProperty}
>      * 
>      * @param bean
>      *            the bean of this {@code ObjectProperty}
>      * @param name
>      *            the name of this {@code ObjectProperty}
>      * @param invalidationConsumer
>      *                          the consumer to be called when the bean is 
> invalidated
>      */
>     public InvalidatedSimpleObjectProperty(Object bean, String name, final 
> Consumer<InvalidatedSimpleObjectProperty<T>> invalidationConsumer) {
>        super(bean, name);
>        if( invalidationConsumer == null ) {
>               throw new IllegalArgumentException("Consumer can not be null");
>        }
>        this.invalidationConsumer = invalidationConsumer;
>     }
> 
>     /**
>      * The constructor of {@code ObjectProperty}
>      * 
>      * @param bean
>      *            the bean of this {@code ObjectProperty}
>      * @param name
>      *            the name of this {@code ObjectProperty}
>      * @param initialValue
>      *            the initial value of the wrapped value
>      * @param invalidationConsumer
>      *                          the consumer to be called when the bean is 
> invalidated
>      */
>     public InvalidatedSimpleObjectProperty(Object bean, String name, T 
> initialValue, final Consumer<InvalidatedSimpleObjectProperty<T>> 
> invalidationConsumer) {
>         super(bean,name,initialValue);
>         if( invalidationConsumer == null ) {
>               throw new IllegalArgumentException("Consumer can not be null");
>         }
>         this.invalidationConsumer = invalidationConsumer;
>     }
>     
>     @Override
>     protected void invalidated() {
>       invalidationConsumer.accept(this);
>     }
> }


On 22.01.13 10:30, Richard Bair wrote:
>> Is the Java8 plan still there if not should the current Simple*Property
>> subclasses who overload invalidated be changed to PropertyBase?
> 
> It is unlikely that we'll be able to do anything major here in Java 8 just 
> because we don't really have Lambda yet that we can play with, and changing 
> over every property is a big job. Unless we knew it would be a major win. I 
> would say, if you encounter a Simple* property that has been subclassed, then 
> we should fix it up as we go to be a PropertyBase* guy instead.
> 

Reply via email to