我们如何正确跟踪Java(特别是JavaFX)中对象属性的更改?
我的应用程序允许用户修改基础数据模型对象的属性。当用户单击“保存”按钮时,我想将对象的新状态保存到数据库中。但是,如果用户单击“取消”,则需要恢复到对象的原始状态。
请考虑以下示例对象(为清楚起见,省略了getter):
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);
}
}
理想情况下,我希望GUI加载原始的Person
对象,并对其进行复制以绑定到UI控件(即使我需要自己编写此方法):
Person editedPerson = copyOf(originalPerson);
然后,如果用户单击“取消”,则不执行任何操作。但是,单击“保存”后,将originalPerson
设置为等于editedPerson
。
我将looked放入了cloning objects中,但是一般的共识似乎建议不要这样做,因为它不能确保不更改原始对象。另外,除非进行深层复制,否则Person
中的任何对象引用都将无法正确复制。
我见过的另一个选择是使用复制构造函数,但是我的实际应用程序使用的对象比上面的示例复杂得多。每个对象中嵌套了多个级别的对象,手动复制整个层次结构似乎有些过分。
那么主要问题是什么??已经有可用的API(或第三方库)来处理此功能吗?对于用户来说,能够恢复其更改似乎是一个非常标准的期望。