InvalidationListener和ChangeListener有什么区别?

3

正如您所知,在Java中,ObservableValue 可以生成两种类型的事件:InvalidationChange。那么它们之间有什么区别呢?

我们什么时候应该使用 Invalidation 或者 Change 监听器呢?


仅仅通过阅读JavaDocs,我们可以知道InvalidationListener的支持来自于父类Observable,它的目的有点模糊不清,但我认为这是故意的,因为其含义取决于具体实现的上下文。 - MadProgrammer
然而,ObservableValueJavaDocs 表明 - MadProgrammer
ObservableValue 生成两种类型的事件:更改事件和失效事件。更改事件表示值已更改。如果当前值不再有效,则会生成失效事件。如果 ObservableValue 支持延迟计算,则此区别变得重要,因为对于延迟计算的值,人们不知道无效值是否真的已更改,直到重新计算它。因此,生成更改事件需要急切计算,而失效事件可以为急切和延迟实现生成。 - MadProgrammer
通俗地说,“嘿,值已经改变了”和“嘿,值被发现无效”是两个不同的事件。 - KC Wong
1
请参考以下链接:https://dev59.com/VFsX5IYBdhLWcg3wau8r - James_D
在无效事件中,值可能已更改或未更改。在更改事件中,值已更改,并且您将接收旧值和新值作为参数。此外,虽然changelisteners用于属性,但支持invalidationlisteners的类型列表更大(例如ObservableList...)。 - fabian
1个回答

3
根据文档:
ObservableValue 生成两种类型的事件:更改事件和无效事件。更改事件表示值已更改。如果当前值不再有效,则会生成无效事件。如果 ObservableValue 支持延迟计算,则此区别变得重要,因为对于延迟计算的值,直到重新计算才知道无效值是否真的已更改。因此,生成更改事件需要急切的评估,而无效事件可以为急切和懒惰的实现生成。
ChangeListener 即使可观察值支持延迟计算也强制进行急切计算。
如果您想找到已观察属性中发生的更改,可以使用 ChangeListener。而 InvalidationListener 只帮助我们知道有些更改已发生,如果您想知道旧值和新值之间的差异,必须自己计算或简单地使用 ChangeListener。

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