2017-08-29 22 views
0

Heyho,看看這個類我該如何讓這個拷貝構造函數在java中進行深層拷貝?

public class ComplexFoo { 
    TreeMap<String, String> field1; 
    double[] field2; 

    public ComplexFoo() { 
    field1 = new TreeMap<String, String>(); 
    field2 = new double[1]; 
    } 

    public ComplexFoo(ComplexFoo cf){ 
    field1 = cf.field1; 
    field2 = cf.field2; 
    } 

    public static void main(final String[] args) { 
    ComplexFoo foo = new ComplexFoo(); 
    foo.field2[0] = 5.0; 
    ComplexFoo bar = new ComplexFoo(foo); 
    bar.field2[0] = 3.0; 
    System.out.println(foo.field2[0]); 
    } 
} 

這將打印3.0。我想這是因爲我的拷貝構造函數只拷貝了對數組/映射的引用,而不是真正的數據結構。我需要更改哪些內容才能確保進行深度複製?

如果我編寫一個將ComplexFoo作爲字段的類,我是否必須編寫一個使用ComplexFoos拷貝構造函數的拷貝構造函數,或者是否存在任何可以使用的遞歸深度拷貝機制?

+3

您發佈不編譯代碼:沒有沒有'ComplexFoo()'的參數構造函數,任何'bsp'應該是不存在的。 –

+0

我確實在尋找'clone()'方法。 –

回答

6

這不是一個深刻的副本:

public ComplexFoo(ComplexFoo cf){ 
    field1 = cf.field1; 
    field2 = cf.field2; 
    } 

新創建ComplexFoo實例是指作爲參數提供的實例字段。

要進行深度複製,您必須創建新對象。

TreeSet(Collection)做工作創造從Collection參數的新TreeSetObject.clone()行之有效的一些一個維數組原語值:

public ComplexFoo(ComplexFoo cf){ 
    field1 = new TreeSet<>(cf.field1); 
    field2 = cf.field2.clone(); 
    } 
1

你可以把空的測試和驗證:

public ComplexFoo(ComplexFoo cf){ 
    field1 = new TreeMap<>(cf.field1); 
    field2 = Arrays.copyOf(cf.field2, cf.field2.length); 
}