ReadOnlyBooleanWrapper
使用 . 绑定两个对象时,我遇到了一个非常奇怪的行为Binding.or
。即,当我b1.set(true)
对第一个参数进行处理时,结果不正确(仍然是错误的)。
这是一个简单的单元测试(失败):
@Test
public void testReadOnlyBooleanWrapper() {
// Fails!!!
testOr(new ReadOnlyBooleanWrapper(false), new ReadOnlyBooleanWrapper(false));
}
public void testOr(BooleanProperty b1, BooleanProperty b2) {
BooleanExpression or = b1.or(b2);
assertEquals(or.get(), b1.get() || b2.get());
b1.set(true);
assertEquals(or.get(), b1.get() || b2.get());
b1.set(false);
assertEquals(or.get(), b1.get() || b2.get());
}
请注意,相同的测试可以SimpleBooleanProperties
正常工作:
@Test
public void testSimpleBooleanProperty() {
// Passes
testOr(new SimpleBooleanProperty(false), new SimpleBooleanProperty(false));
}
我可能在这里遗漏了一些要点并滥用了属性,因为我无法想象实现中会出现这样的错误!:)
感谢任何想法如何解释它!
更新:
您的回答和评论使我走上了正确的轨道:)我还没有解决方案,但我注意到如果我将其绑定or
到ReadOnlyProperties
(应该被暴露)而不是包装器本身,那么测试通过:
@Test
public void testOrReadOnly() {
ReadOnlyBooleanWrapper b1 = new ReadOnlyBooleanWrapper(false);
ReadOnlyBooleanWrapper b2 = new ReadOnlyBooleanWrapper(false);
BooleanExpression or = b1.getReadOnlyProperty().or(b2.getReadOnlyProperty());
System.out.println("Condition " + or.get());
assertEquals(or.get(), b1.get() || b2.get());
b1.set(true);
System.out.println("Condition " + or.get());
assertEquals(or.get(), b1.get() || b2.get());
b1.set(false);
System.out.println("Condition " + or.get());
assertEquals(or.get(), b1.get() || b2.get());
}
这让我认为内部可读写属性与只读属性之间的同步以某种方式被破坏了(?)
从有关文档的文档中ReadOnlyBooleanWrapper
:
该类提供了一个方便的类来定义只读属性。它创建了两个同步的属性。一个属性是只读的,可以传递给外部用户。另一个属性是可读写的,只能在内部使用。