我正在研究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
方法的当前值,该方法是从包装器获取的。谁能解释?
答案 0 :(得分:3)
当前值存储在用于事件处理的帮助器类中,请参见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
存储在属性对象的字段中,在这种情况下,存储在ReadOnlyStringPropertyBase
的{{1}}字段中。)