JavaFX如何处理循环属性绑定?

时间:2016-11-08 11:38:35

标签: javafx binding

假设我有以下代码段:

        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的属性。正确?

1 个答案:

答案 0 :(得分:0)

JavaFX不会阻止这种依赖 依赖项中可能没有循环,在这种情况下是允许的。分析依赖关系是不可能的,因为bindObservableValue作为参数,无论实现如何,实现的内部都隐藏在“接口后面”,因此不可能从{{{}}获取依赖关系。 {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,因此这种依赖关系不应该被创造。