Как правильно отслеживать изменения свойств объекта в 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 (или сторонняя библиотека), который обрабатывает эту функцию? Похоже, довольно стандартное ожидание для пользователя, чтобы иметь возможность отменить свои изменения.