JavaFX - "invalid"属性的含义

8
在JavaFX的上下文中,当属性发生变化时,何谓“无效”?我不理解为什么要使用这个术语。
JavaFX属性是一个可观察的对象,包装了一个字段值。所以当属性更新或者变成无效时,它的监听者/观察者会被通知。那么这是什么意思呢?

1
这是一篇关于JavaFX 2属性和绑定实现的前任主要开发人员撰写的更改与失效之间的博客 - jewelsea
2个回答

10

我在这里找到了很好的解释。

enter image description here

当调用intProperty.set(7168)时,它会向otherProperty触发一个无效事件。收到此无效事件后,otherProperty仅记录其值不再有效的事实。它不会立即通过查询intProperty的值来重新计算其值。重新计算将在稍后调用otherProperty.get()时执行。想象一下,如果我们像上面的代码中只调用一次intProperty.set()而不是多次调用intProperty.set(),则otherProperty仍然仅重新计算其值一次。

在测试后,我找到了这个例子。

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;

public class InvalidMean{
    public static void main(String[] args){
        IntegerProperty num1 = new SimpleIntegerProperty(15);
        IntegerProperty num2 = new SimpleIntegerProperty(10);
        // num2.bind(num1);
        // num1.set(56);
        System.out.println(num2);
    }
}

运行这段代码,您将得到以下输出:
IntegerProperty [value: 10]

现在取消已注释行的注释,您将获得以下输出结果。
IntegerProperty [bound, invalid]
num2的值变为无效值,因为新值已经到达但尚未更新。正如JavaFX文档所描述的那样,这仅是因为惰性求值。

JavaFX绑定和属性实现都支持惰性评估,这意味着当发生更改时,值不会立即重新计算。如果以后需要该值,则稍后重新计算。

如果您希望值有效,请在System.out.println(num2); 之前调用num2.getValue(); num2.get(); ,您将看到属性将变得有效。

注意:在上面的示例中,num2.bind(num1); num1.set(56); 都会使num2的值无效,因为绑定已经更改了num2的值,而set()也试图更改该值。


0

这是关于惰性求值的。这个视频链接是从2011年Devoxx会议上的,对我帮助很大,让我理解了这个概念。

对你来说最有意思的部分是在5:00左右。


@UnKnown 抱歉,无法再找到该视频了。 - Spotted
@Spootted 没问题。我也为这个问题添加了一个答案,如果你喜欢可以阅读并让我知道是否有误。谢谢。 - Asif Mushtaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接