我正在研究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字段中。)

关于java - ReadOnlyStringWrapper.ReadOnlyPropertyImpl从哪里获取ChangeListener的oldValue?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54386648/

10-15 20:09