我读到了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);
答案 0 :(得分:2)
您正在寻找的功能(或多或少)由Bindings
在createIntegerBinding
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设计者选择的机制。