2012-10-19 103 views
2

我有一個DAO例如Java同步同類對象的特性

public class Foo { 
    private final int ID; 
    private String text; 
    private String title; 

    public void refresh() { 
     Foo refreshedFoo=Database.getInstance().getFooById(ID); 
     // *** Problem here *** 
    } 
    // ... Getters and setters for all fields 
} 

有時候,我需要更新一個DAO(從DB刷新)的所有領域。那麼如何將this的所有特性設置爲refreshedFoo的相應值,而無需爲每個屬性編寫任務?

回答

3

除非您使用某個庫(可能基於反射)來做同樣的事情,否則除了分配每個屬性外,沒有其他方法可以分配每個屬性。

另一種方法是使用新的實例refreshedFoo並丟棄舊的,如果這可能適用於您的應用程序。也許你可以有一個ProxyFoo,它只包含一個指向可以在刷新時打開的Foo的指針?

+0

代理對象是解決我的問題的最簡單的方法 – gorootde

0

我不認爲這是有辦法做到這一點,除了使用一些魔法反射黑客:)

0

你將不得不使用每個屬性分配。如果你不打算手動完成,你可以使用任何可用的庫,例如Apache Commons提供了一個BeanUtils類。它有一個方法copyProperties。你可以在這種情況下使用它。

2

有兩種方法實現Clonable接口和調用clone()方法的一種方法,第二種方法創建一個構造函數,將Foo對象作爲參數並賦值,以便每次調用該對象。

並且在FOODAO中另一個類中放置刷新方法,而FOO是模型對象,所以不應該有刷新方法。通過這種方式可以解決問題

+0

我都是這種情況,但您仍然需要手動編寫任務。 – Thilo

+0

@Thilo no,Object.clone()將所有字段從一個對象複製到另一個對象 –

+0

是的肖恩是對的,你不要手動排序,這裏是示例URl:http://www.java-samples.com/showtutorial .php?tutorialid = 344 – zaffargachal

0

使用ORM(如hibernate)來避免手動編寫代碼。或者在春天有行映射器,這減少了這種代碼的需要。

唯一的另一種方法是使用力的黑暗面:反射。

+0

似乎'Database.getInstance()。getFooById()'已經是某種ORM。 – Thilo

+0

@Thilo哦,是的,所以已經有一個最新的foo爲什麼OP要求另一個。如果由於某種原因需要按照zaffargachal的說法去做。 – NimChimpsky