我只对属性是否已更改感兴趣,而对新值不感兴趣。

注册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的问题是,如果值再次变为,则不会通知您更改,因为它已经无效。您必须为此使用更改侦听器。

在属性上注册更改侦听器将禁用惰性评估,因此,每次触发更改侦听器时都会触发无效事件。

在我添加的示例中尝试一下。

08-07 03:44