我只对属性是否已更改感兴趣,而对新值不感兴趣。
注册InvalidationListener
而不是ChangeListener
是否有利?
我以为对属性的更改会首先使该属性无效并通知所有无效侦听器。仅当已注册更改侦听器或有人请求此属性时,该属性才会被“验证”/重新计算,并且所有更改侦听器都将使用新值进行更新。
由于我对实际值不感兴趣,因此我认为仅侦听无效事件(属性已更改但未重新计算,是某种中间状态)具有性能优势。
最佳答案
您需要为此实现一个ChangeListener
。仅当值变为无效时才执行InvalidationListener
。参见docs。
从ObservableValue的Java文档中:
我添加了一个简单的例子
public static void main(String[] args) {
SimpleIntegerProperty one = new SimpleIntegerProperty(1);
SimpleIntegerProperty two = new SimpleIntegerProperty(0);
// the binding we are interested in
NumberBinding sum = one.add(two);
sum.addListener(observable -> System.out.println("invalidated"));
// if you add a value change listener, the value will NOT be evaluated lazy anymore
//sum.addListener((observable, oldValue, newValue) -> System.out.println("value changed from " + oldValue + " to " + newValue));
// is valid, since nothing changed so far
System.out.println("sum valid: " + sum.isValid());
// will invalidate the sum binding
two.set(1);
one.set(2); // invalidation event NOT fired here!
System.out.println("sum valid: " + sum.isValid());
// will validate the sum binding, since it is calculated lazy when getting the value
System.out.println("sum: " + sum.getValue());
System.out.println("sum valid: " + sum.isValid());
}
使用
InvalidationListener
的问题是,如果值再次变为,则不会通知您更改,因为它已经无效。您必须为此使用更改侦听器。在属性上注册更改侦听器将禁用惰性评估,因此,每次触发更改侦听器时都会触发无效事件。
在我添加的示例中尝试一下。