Java ReadOnlyStringWrapper.ReadOnlyPropertyImpl从何处获取ChangeListener的旧值?
我正在学习JavaFX11的Java ReadOnlyStringWrapper.ReadOnlyPropertyImpl从何处获取ChangeListener的旧值?,java,javafx,Java,Javafx,我正在学习JavaFX11的ReadOnlyStringWrapper.ReadOnlyPropertyImpl类,即: private class ReadOnlyPropertyImpl extends ReadOnlyStringPropertyBase { @Override public String get() { return ReadOnlyStringWrapper.this.get(); } @Override pu
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
将在哪里为changelister
获取oldValue
。正如我们看到的,它只覆盖当前值的get
方法,该方法取自包装器。有人能解释一下吗?当前值存储在用于事件处理的helper类中,请参见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
的helper
字段中。)当前值存储在用于事件处理的helper类中,请参见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
的helper
字段中。)请注意,所有的xxPropertyBase
,ReadOnlyxxPropertyBase
,和observeValueBase
类以公认答案中解释的方式存储旧值,而不仅仅是提到的ReadOnlyPropertyImpl
@Slaw好的,谢谢你的提示。@Slaw顺便说一句,也许你可以给我一些建议。在Java中,我们有整数和整数。因此,IntegerPropertyBase
有set(int)
和setValue(Number)
。考虑到JS中有number
原语和number
对象,您认为,如果我们将javafx移植到JavaScript,那么NumberPropertyBase
set
和setValue
必须具备什么。我想在JS中,我们必须NumberPropertyBase.set(number)
和NumberPropertyBase.setValue(number)
。你同意吗?我对JavaScript(或TypeScript)不够熟悉,无法给出正确的意见,但如果Number
和Number
真的分别是Integer
和int
的必然结果,那么我倾向于同意。您可能想问一个新问题,以便从熟悉JavaScript/TypeScript的人员那里获得反馈。@Slaw不幸的是,在TypeScript中似乎不可能做到这一点,因为1)ObservalEvalue有getValue():T,但当我们在ObservalEnumberValue中使用它时,我们将其用作ObservalEvalue,请参见此处2)对象类不可分配给它们的原语。请注意,所有的XXXPropertyBase
、readonlyxxPropertyBase
、和observeValueBase
类都以公认答案中解释的方式存储旧值,而不仅仅是提到的ReadOnlyPropertyImpl
@Slaw Ok,谢谢你的留言。@Slaw顺便说一句,也许你能给我一些建议。在Java中,我们有整数和整数。因此,IntegerPropertyBase
有set(int)
和setValue(Number)
。考虑到JS中有number
原语和number
对象,您认为,如果我们将javafx移植到JavaScript,那么NumberPropertyBase
set
和setValue
必须具备什么。我想在JS中,我们必须NumberPropertyBase.set(number)
和NumberPropertyBase.setValue(number)
。你同意吗?我对JavaScript(或TypeScript)不够熟悉,无法给出正确的意见,但如果Number
和Number
真的分别是Integer
和int
的必然结果,那么我倾向于同意。您可能想问一个新问题,以便从熟悉JavaScript/TypeScript的人员那里获得反馈。@Slaw不幸的是,在TypeScript中似乎不可能做到这一点,因为1)ObservalEvalue有getValue():T,但当我们在ObservalEnumberValue中使用它时,我们将其用作ObservalEvalue,请参见此处2)对象类不可分配给其原语。