【发布时间】:2015-09-29 14:46:55
【问题描述】:
我在使用Binding.or 绑定两个ReadOnlyBooleanWrapper 对象时遇到了一个非常奇怪的行为。也就是说,当我对第一个参数执行 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));
}
我可能在这里遗漏了一些要点并滥用了属性,因为我无法想象实现中会出现这样的错误! :)
感谢任何想法如何解释它!
更新:
您的回答和 cmets 让我走上了正轨 :) 我还没有解决方案,但我注意到如果我将 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的文档:
这个类提供了一个方便的类来定义只读属性。它创建了两个同步的属性。一个属性是只读的,可以传递给外部用户。另一个属性是可读写的,只能在内部使用。
【问题讨论】:
-
@assylias 这是一个只读的包装器:即它是一个包装
ReadOnlyProperty的完全可写属性。此 API 旨在表示只能从包含它们的 bean 更改的值,但可以将ReadOnlyProperty公开为公共 API 以供外部观察。 -
这是一个“包装器”:您仍然可以将其用作普通属性,但可以向客户端公开只读版本。根据文档:docs.oracle.com/javase/8/javafx/api/javafx/beans/property/…
标签: java javafx property-binding