Как отслеживать свойства объекта до и после? - PullRequest
0 голосов
/ 04 июля 2018

Как правильно отслеживать изменения свойств объекта в Java (особенно в JavaFX)?

Мое приложение позволяет пользователям изменять свойства базовых объектов модели данных. Когда пользователь нажимает кнопку «Сохранить», я хочу сохранить новое состояние объекта в базе данных. Однако, если пользователь нажимает «Отмена», мне нужно вернуться к исходному состоянию объекта.

Рассмотрим следующие примеры объектов (для ясности опущены геттеры):

class Person {

    private final StringProperty name = new SimpleStringProperty();
    private final StringProperty email = new SimpleStringProperty();
    private final SimpleListProperty<PhoneNumber> phoneNumbers = new SimpleListProperty<>();

    public Person(String name, String email, ObservableList<PhoneNumber> phoneNumbers) {
        this.name.set(name);
        this.email.set(email);
        this.phoneNumbers.set(phoneNumbers);
    }
}

class PhoneNumber {

    private final IntegerProperty areaCode = new SimpleIntegerProperty();
    private final IntegerProperty prefix = new SimpleIntegerProperty();
    private final IntegerProperty lineNumber = new SimpleIntegerProperty();

    public PhoneNumber(int areaCode, int prefix, int lineNumber) {
        this.areaCode.set(areaCode);
        this.prefix.set(prefix);
        this.lineNumber.set(lineNumber);
    }
}

В идеале я хочу, чтобы графический интерфейс пользователя загружал исходный объект Person и делал его копию для привязки к элементам управления пользовательского интерфейса (даже если мне нужно написать этот метод самостоятельно):

Person editedPerson = copyOf(originalPerson);

Затем, если пользователь нажимает «Отмена», ничего не делать. Однако после нажатия «Сохранить» установите originalPerson равным editedPerson.

Я просмотрел в клонирование объектов , но общий консенсус, кажется, не рекомендует этого, поскольку он не гарантирует оригинал Объект не изменен. Кроме того, если не сделать глубокое копирование , любые ссылки на объекты в Person, например, не будут скопированы должным образом.

Другой вариант, который я видел, это использовать конструктор копирования , но мое реальное приложение использует гораздо более сложные объекты, чем в приведенном выше примере. Есть несколько уровней объектов, вложенных в каждый объект, и ручное копирование всей иерархии кажется излишним.

Так в чем же главный вопрос? Существует ли уже доступный API (или сторонняя библиотека), который обрабатывает эту функцию? Похоже, довольно стандартное ожидание для пользователя, чтобы иметь возможность отменить свои изменения.

...