2013-02-03 63 views
0

可能重複:
How to properly override clone method?是否有一種更簡單的方法來克隆具有數十個成員變量的對象?

我有中有一堆原始變量,約100-200總一個簡單的類。它的結構很簡單,像這樣:

public class Level implements Clonable { 
    int speed; 
    boolean wallKicks; 
    boolean bigMode; 
    float targetFrequency; 
    long milliseconds; 
    double fade; 
    int[] perfectPenalties; 
    <100 or so more things like this> 
} 

我需要能夠克隆這個類。現在,我只是明確地輸入了每個成員變量的複製動作在我的clone()方法:

public Object clone() { 
    Level newLevel = new Level(); 
    newLevel.speed = speed; 
    newLevel.wallKicks = wallKicks; 
    newLevel.bigMode = bigMode; 
    newLevel.perfectPenalties = perfectPenalties.clone(); 
    <etc> 
} 

的問題是,它是一個有點任務,以確保我沒有錯過我的克隆方法中的任何值。將來我還想實現一個equals()函數,這意味着我必須手動同步3個地方的數據。不愉快。

有沒有更簡單的方法來實現這個目標?我願意接受編程解決方案或其他任何能夠完成這項工作的人。我只想比查看三個並排變量和變量的匹配變量更容易一些。

謝謝。

+1

您有一個具有100-200個字段的單個類? –

+0

湯姆:是的。這是一個非常小的文件,描述了一個下降塊遊戲的單一級別。遊戲高度可配置,所以有很多變量來表示所有這些選項。 – JoshuaD

回答

2

是的,你可以用下面的方法來克隆:

1)的Java序列化機制來複制你的對象:

ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
out = new ObjectOutputStream(bout); 

out.writeObject(obj); 
out.close(); 

ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); 
in = new ObjectInputStream(bin);    
Object copy = in.readObject(); 

2)apache.commons.lang庫有org.apache.commons.lang.SerializationUtils .clone()

3)使用dozer

4)用戶Kyro,雖然我從來沒有使用過它

for equals()使用org.apache.commons.lang.builder.EqualsBuilder .reflectionEquals()

+0

序列化方法是否有速度問題?如果沒有,這似乎是一個完美的解決方案。 – JoshuaD

+0

序列化應該比推土機或Kyro快得多,因爲它不使用反射。 – mantrid

+0

與上面介紹的手寫方法相比,你認爲速度會如何?只要沒有重大的速度問題,那麼這個解決方案就是我正在尋找的解決方案。班級不會克隆得太多。每當裝入一個新的電平系統時,將執行10-25次。所以只要沒有明顯的速度問題,這聽起來就像是一個竅門。 – JoshuaD

相關問題