假设我有以下代码段:
private final BooleanProperty a = new SimpleBooleanProperty(false);
private final BooleanProperty b = new SimpleBooleanProperty(false);
private final BooleanProperty c = new SimpleBooleanProperty(false);
private final BooleanProperty d = new SimpleBooleanProperty(false);
a.bind(c);
c.bind(d.or(a));
JavaFX如何处理?因为a依赖于c, 但c取决于d或a)。是否有一个公式来识别这样的例外'?
我的第一个想法是,property_a不能绑定到另一个绑定到property_a或依赖于属性的property_b,它们具有绑定到property_a的属性。正确?
答案 0 :(得分:0)
JavaFX不会阻止这种依赖
依赖项中可能没有循环,在这种情况下是允许的。分析依赖关系是不可能的,因为bind
将ObservableValue
作为参数,无论实现如何,实现的内部都隐藏在“接口后面”,因此不可能从{{{}}获取依赖关系。 {1}}。
因此,程序员必须确保不会创建循环依赖。
修改ObservableValue
只会导致d
。
如果您分析“依赖”关系(传递闭包需要反复无关),您可以识别这类问题,但是您需要将有关依赖关系的信息存储在自定义数据结构中(或分析它) “编译前”手工制作。
有向图适合存储此类信息,并假设您阻止建立任何循环依赖关系,您可以对要绑定的属性的依赖关系进行深度优先搜索。 (DFS就足够了,因为依赖图是一个森林。)
在StackOverflowError
之后的
图表将包含单个边缘:
a.bind(c)
在执行a -> c
之前,您需要在节点c.bind(d.or(a))
和d
中搜索a
的依赖关系,因为您要添加以下边缘:
c
现在c -> d
c -> a
没有绑定,但您可以从d
转到a
,这是您要绑定的c
,因此这种依赖关系不应该被创造。