Java ReadOnlyStringWrapper.ReadOnlyPropertyImpl从何处获取ChangeListener的旧值?

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

我正在学习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
将在哪里为
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)对象类不可分配给其原语。