private final Property<BigDecimal> a = new SimpleObjectProperty<BigDecimal>();
private final Property<BigDecimal> b = new SimpleObjectProperty<BigDecimal>();
private ObjectBinding<BigDecimal> c = new ObjectBinding<BigDecimal>() {
{
super.bind(a, b);
}
@Override
protected BigDecimal computeValue() {
return a.getValue().add(b.getValue());
}
};
public BigDecimal getC() { return c.getValue(); }
我有两个属性和一个绑定到这些属性之和的值。我有一个线程正在查看c
并在更改时调用getC()
,另一个线程应该更新a
&amp; b
。我想更新a
&amp; b
是原子的;我不希望在更新c
但a
没有更新b
时观察c
的值。
我想出的解决方案是使用update(a, 1);
update(b, 2);
update(updateComplete, true); // C is only computed at this point
private final Property<BigDecimal> a = new SimpleObjectProperty<BigDecimal>();
private final Property<BigDecimal> b = new SimpleObjectProperty<BigDecimal>();
private final IntegerProperty updateComplete = new SimpleIntegerProperty(0);
private ObjectBinding<BigDecimal> c = new ObjectBinding<BigDecimal>() {
{
super.bind(updateComplete);
}
@Override
protected BigDecimal computeValue() {
return a.getValue().add(b.getValue());
}
};
public BigDecimal getC() { return c.getValue(); }
绑定的第三个属性作为标志来表示更新完成,例如
<fieldset disabled id="homeFieldset">...</fieldset>
这个问题是否有更惯用的解决方案?
答案 0 :(得分:0)
一种可能的解决方案,虽然我不称之为惯用语;),是为c
提供2种不同的绑定。两个绑定都具有相同的computeValue
方法,但其中一个绑定仅a
(或b
,具体取决于您的需要。)
线程查看c
将获得对绑定的访问权限,只有在一个值发生更改时才会更新。
private final ObjectBinding<BigDecimal> c = new ObjectBinding<BigDecimal>()
{
{
super.bind( a, b );
}
@Override
protected BigDecimal computeValue()
{
return a.getValue().add( b.getValue() );
}
};
private final ObjectBinding<BigDecimal> cOnlyOnBChange = new ObjectBinding<BigDecimal>()
{
{
super.bind( b );
}
@Override
protected BigDecimal computeValue()
{
return a.getValue().add( b.getValue() );
}
};
请参阅full example。