*PropertyBase vs Simple*Property
Tomas Mikula
tomas.mikula at gmail.com
Sat Mar 22 13:54:41 UTC 2014
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