Cool. What we then need to measure is the impact to dynamic footprint (i.e.: 
heap usage). Do the extra 3 fields per property object (bean, name, invalidated 
method) have any significant impact? Or are these property instances created so 
infrequently that it doesn’t make any real difference?

Richard

On Mar 21, 2014, at 12: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;
>>    }
> 
> 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