On Sat, Mar 22, 2014 at 4:41 PM, Tom Schindl <tom.schi...@bestsolution.at> wrote: > Ah i missed you passing them to the constructor. > > Still i don't see this as much an improvement because we still create a vast > amount of anon inner classes.
Sure, I just wanted to get the baseline for comparison right. Tomas > > Tom > > Von meinem iPhone gesendet > >> Am 22.03.2014 um 16:23 schrieb Tom Schindl <tom.schi...@bestsolution.at>: >> >> Why not i expect the property to be fully initialize so this would be a >> breaking change in behavior. >> >> Tom >> >> Von meinem iPhone gesendet >> >>> Am 22.03.2014 um 14:54 schrieb Tomas Mikula <tomas.mik...@gmail.com>: >>> >>> 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. >>>>