比方說,我們有專人實體:如何編寫可維護的merge()方法?
class Person {
/*
once the id is assigned, then must not be modified!
assume that the id will be assigned by the ORM framework
*/
int id;
String givenName;
String familyName;
}
我,我們有兩個人:原來的人與更新的人:
Person original = new Person("Frantisek", "Makovicka");
Person updated = new Person("Viktor", "Makovicka");
我想合併更新的人用原來的人,所以我寫了以下簡單的方法:
// return number of changed fields
public int merge(Person original, Person updated) {
int changes = 0;
String oldGivenName = original.givenName;
original.givenName = updated.givenName;
if (changed(oldGivenName, original.givenName)) changes++;
String oldFamilyName = original.familyName;
original.familyName = updated.familyName;
if (changed(oldFamilyName, original.familyName)) changes++;
return changes;
}
它工作正常,但我看到了一些問題:每次
將會在Person類中添加新的字段,程序員不應該忘記更新merge()方法,並且萬一Person有很多字段,那麼維護這個方法將會很困難。
所以我的問題是:有沒有更聰明/健壯的方式來合併對象的狀態而不使用語言的反射功能,以便您可以確保所有且僅需要的字段被合併? 在此先感謝!
UPD:
本來我問是否有寫它,而無需使用反射,但忘了說,這是不限制的方式!我還應該說,我有一個想法,用反射+註釋「可合併」字段和一些自定義註釋來編寫此方法,然後跳過沒有註釋的字段。 因此,這些詞的意圖:「不使用反射」是發現其他可能不是那麼明顯的解決方案:)
對這個問題的啓示是這種功能樣式的方法:(確保資源將被關閉,僅作爲例子不是那麼顯而易見的解決方案和安全編程)的
public static void doWithResource(String name, Consumer<Resource> consumer) {
Resource res = new Resource(name);
consumer.accept(res);
res.close();
}
更改未定義。你必須改變++。現在設置它的方式,你將總是從上面的方法返回0。 – Inxsible
您正在使用更新來覆蓋原始文件,在這種情況下,您可能應該只是覆蓋原始指針,而不是調用合併方法。如果你必須這樣做,我認爲你正在尋找反思。 (主要區別在於,如果這些是擴展Person的兩個不同類,那麼合併應注意嗎?) – Tezra
您可以做一些反思並查看您班級的每個(可能註釋過的)字段。 – danielspaniol