2017-08-29 5 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を出力します。コピーコンストラクタは、実際のデータ構造ではなく、Array/Mapへの参照のみをコピーするためです。ディープコピーを確実にするために何を変更しなければなりませんか?

ComplexFooをフィールドとして受け取るクラスを作成すると、ComplexFoosコピーコンストラクタを使用するコピーコンストラクタを作成する必要がありますか、使用できる再帰的なディープコピーメカニズムがありますか?

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

あなたが投稿コンパイルできないコードを:何もなしはありません'ComplexFoo()'の引数のコンストラクタであり、 'bsp'となるべきものは存在しません。 –

+0

あなたは実際に 'clone()'メソッドを探しています。 –

答えて

6

これは深いコピーではありません:

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

新しい作成ComplexFooインスタンスが、パラメータとして提供インスタンスのフィールドを参照する

1

あなたはヌルテストと検証を置くことができます。

ディープコピーを作成するには、新しいオブジェクトを作成する必要があります。

TreeSet(Collection)Collectionパラメータから新しいTreeSetを作成するために仕事をしていませんし、数の1次元配列に値プリミティブのObject.clone()はうまく機能:

public ComplexFoo(ComplexFoo cf){ 
    field1 = new TreeSet<>(cf.field1); 
    field2 = cf.field2.clone(); 
    } 
関連する問題