*PropertyBase vs Simple*Property
Tom Schindl
tom.schindl at bestsolution.at
Sat Mar 22 15:23:38 UTC 2014
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.mikula at gmail.com>:
>
> On Fri, Mar 21, 2014 at 8:53 PM, Tom Schindl
> <tom.schindl at 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.
>>
More information about the openjfx-dev
mailing list