ReadOnlyStringWrapper.ReadOnlyPropertyImpl从哪里获取来自ChangeListener的oldValue?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReadOnlyStringWrapper.ReadOnlyPropertyImpl从哪里获取来自ChangeListener的oldValue?相关的知识,希望对你有一定的参考价值。

我正在研究JavaFX11的ReadOnlyStringWrapper.ReadOnlyPropertyImpl类:

private class ReadOnlyPropertyImpl extends ReadOnlyStringPropertyBase {

    @Override
    public String get() {
        return ReadOnlyStringWrapper.this.get();
    }

    @Override
    public Object getBean() {
        return ReadOnlyStringWrapper.this.getBean();
    }

    @Override
    public String getName() {
        return ReadOnlyStringWrapper.this.getName();
    }
};

ReadOnlyPropertyImpl的实例返回给客户端,可以在read only模式下使用它。我无法理解的是ReadOnlyPropertyImpl将把oldValue带到ChangeListener。正如我们所看到的,它只覆盖当前值的get方法,它取自包装器。谁能解释一下?

答案

当前值存储在用于事件处理的帮助程序类中,请参阅com.sun.javafx.binding.ExpressionHelper。例如。如果你看一下SingleChange静态内部类中的具体实现:

private T currentValue;

...

@Override
protected void fireValueChangedEvent() {
    final T oldValue = currentValue;
    currentValue = observable.getValue();

    ...
    listener.changed(observable, oldValue, currentValue);
    ...
}

Generic,处理变更事件的另一个类有类似的实现。

添加侦听器会导致创建ExpressionHelper实例(或修改现有实例),并且此对象负责调用事件处理程序。 (ExpressionHandler存储在属性对象的字段中,在本例中为ReadOnlyStringPropertyBasehelper字段。)

以上是关于ReadOnlyStringWrapper.ReadOnlyPropertyImpl从哪里获取来自ChangeListener的oldValue?的主要内容,如果未能解决你的问题,请参考以下文章