On Fri, Mar 21, 2014 at 8:53 PM, Tom Schindl
<tom.schi...@bestsolution.at> wrote:
> 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;
>>     }

Nice idea. Just to get the comparison to status quo more fair, you
don't need to override getBean() and getName() methods:

public final ObjectProperty<Rectangle2D> viewportProperty() {
    if (viewport == null) {
        viewport = new SimpleObjectProperty<Rectangle2D>(this, "viewport") {

            @Override
            protected void invalidated() {
                invalidateWidthHeight();
                impl_markDirty(DirtyBits.NODE_VIEWPORT);
                impl_geomChanged();
            }
        };
    }
    return viewport;
}

Regards,
Tomas

>
> 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