为什么JavaFX低级绑定不使用lambdas和功能接口?

时间:2014-10-17 20:33:38

标签: java lambda javafx-8

我读到了javaFx低级绑定用法,我有一个问题。

目前为了创建一个新的Integer属性,我需要做这样的事情:

SimpleIntegerProperty simpleIntegerProperty = new SimpleIntegerProperty(5);
IntegerBinding x = new IntegerBinding(){
    {
       super.bind(simpleIntegerProperty);
    }
    @Override
    protected int computeValue(){
            return 456 * simpleIntegerProperty.get();
    }
};

这很烦人。

为什么不利用lambda API?

提供类似的东西:

interface ValuedBinding<X>{
    X computeValue();

    default Property<X> bind(ObservableValue<X> xObservableValue){
        //blaa...
        return null;
    }

    default <E extends Property<X>> E bindBidirectional(E xProperty){
        //blaa...
        return null;
    }
}

interface IntegerBinding2 extends ValuedBinding<Number> {
 // dada....
}

用法如下:

    IntegerBinding2 integerBinding = () -> 5;
    integerBinding.bindBidirectional(simpleIntegerProperty);

1 个答案:

答案 0 :(得分:2)

您正在寻找的功能(或多或少)由BindingscreateIntegerBinding method课程中提供:

IntegerProperty simpleIntegerProperty = new SimpleIntegerProperty(5);
IntegerBinding integerBinding = Bindings.createIntegerBinding( () -> 
    simpleIntegerProperty.get() * 456, simpleIntegerProperty );

以及IntegerExpression类:(对于您使用的具体示例):

IntegerProperty simpleIntegerProperty = new SimpleIntegerProperty(5);
IntegerBinding x = simpleIntegerProperty.multiply(456);

您展示的实际代码混淆了绑定和属性:无法设置绑定,因为(例如)它们可能表示依赖于多个其他可观察值的表达式。因此,他们没有,也不能像属性那样拥有bindBidirectional方法。

通常,如您所建议的那样,以广泛的方式使用默认方法可能是不可取的。默认方法不能以保证现有代码不中断的方式添加到接口(例如,this paper by Brian Goetz,特别是第6节)。大部分时间它可能都很好,但最小化它们的使用是明智的。在这种情况下,可以很容易地提供工厂方法以允许使用lambdas,这是JavaFX设计者选择的机制。