2013-09-05 15 views
1

存在名爲foo的類(class0)。從java中的類複製值

我想複製foo到酒吧。

我嘗試這樣做:

bar = class1.foo; 

但是當我改變吧,foo將改變...

我應該怎麼辦?

注1:所有值的類型是ArrayList<ArrayList<class2>>
注2:我也嘗試

public ArrayList<ArrayList<class2>> getFoo(){ 
return new ArrayList<ArrayList<class2>>(foo); 
} 
+2

魔術字在這裏是「參考」。這就是爲什麼現代語言不會迫使你從頭開始瞭解指針和引用的原因。 –

+0

@ThorstenDittmar顯然它*確實會迫使你學習引用,否則問題就不需要問了。 –

+0

@DaveNewton當然,但只有當問題出現時。 –

回答

2

如果

new ArrayList<ArrayList<class2>>(foo) 

沒有達到預期的效果,我假設你想要的是一個深拷貝。

這樣做將是序列化和反序列化,然後它,也最簡單的方法 - 這將與所有序列化對象的工作,無論複雜的(集合的集合集合....對象):

ArrayList<ArrayList<class2>> obj = null; 
    try { 
     FastByteArrayOutputStream fbos = 
       new FastByteArrayOutputStream(); 
     ObjectOutputStream out = new ObjectOutputStream(fbos); 
     out.writeObject(foo); 
     out.flush(); 
     out.close(); 
     ObjectInputStream in = 
      new ObjectInputStream(fbos.getInputStream()); 
     obj = (ArrayList<ArrayList<class2>>) in.readObject(); 
    } 
    catch(IOException e) { 
     e.printStackTrace(); 
    } 
    catch(ClassNotFoundException cnfe) { 
     cnfe.printStackTrace(); 
    } 
    return obj;  

雖然您必須將class2聲明爲Serializable。 如果這不是一種選擇,你必須與

new ArrayList<ArrayList<class2>>(foo.get(i)); 

來聲明遍歷所有的ArrayList foo中的特定方法,把它們拷貝,然後把它們放入造成的ArrayList。

+1

這是一種解決方法。我永遠不會使用它,但我有點挖。 – tom

+0

相信我,如果你想深入複製 ArrayList >>>> 你會使用它。 –

+1

+1。要在單行**中執行相同的操作(深克隆)**,可以使用Apache Commons ['SerializationUtils.clone()'](http://commons.apache.org/proper/commons-lang/javadocs/ api-2.6/org/apache/commons/lang/SerializationUtils.html#clone%28java.io.Serializable%29) –

2

嘗試使用拷貝構造函數。你可以在這裏找到一個例子:copy constructor,重要的部分是:

public final class Galaxy { 

    private double fMass; 
    private final String fName; 

    public Galaxy (double aMass, String aName) { 
    fMass = aMass; 
    fName = aName; 
    } 

    /** 
    * Copy constructor. 
    */ 
    public Galaxy(Galaxy aGalaxy) { 
    this(aGalaxy.getMass(), aGalaxy.getName()); 
    //no defensive copies are created here, since 
    //there are no mutable object fields (String is immutable) 
    } 
} 
+1

您在對我的答覆(Cloneable)(http://www.artima.com/intv/bloch13.html)的評論中給出的鏈接令人信服。 +1複製構造函數並避免Cloneable。我刪除了我的答案。 –

0

你需要讓你的對象Cloneable和覆蓋的clone()方法用於深拷貝。你可以得到一個很好的例子here

另一種方法是使用複製構造函數。 Here就是一個例子。

+0

我該寫什麼?實現,只是做出新的功能! –

+0

重寫Object類的clone()方法。對於要克隆的類的每個變量,您必須創建新變量,而不僅僅是複製引用,然後您可以使用** class0 cCopy = yourClass0Object.clone()**簡單獲取副本。現在,您可以通過** cCopy.getfoo()**或** cCopy.foo(如果公開)**來訪問您的數據。 –