Откуда ReadOnlyStringWrapper.ReadOnlyPropertyImpl берет oldValue для ChangeListener? - PullRequest
0 голосов
/ 27 января 2019

Я изучаю ReadOnlyStringWrapper.ReadOnlyPropertyImpl класс JavaFX11, а именно:

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 для текущего значения, которое берется из оболочки.Кто-нибудь может объяснить?

1 Ответ

0 голосов
/ 27 января 2019

Текущее значение сохраняется в классе помощника, который используется для обработки события, см. 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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...