3

Java の「ディープ コピー」の概念を理解するのに苦労しています。

さまざまなパラメーターを持つクラス「myClass」があると仮定します。次のようなクラスのディープ コピーを返すメソッド「copy」を作成してみました。

public myClass copy() {

    myClass deepCopy = new myClass();
    deepCopy.varA = varA;
    deepCopy.varB = varB;
    return deepCopy;

}

これが本当に「ディープコピー」なのか、それとも私が何か間違っているのかを誰かが確認できますか?

ありがとう!

4

6 に答える 6

1

自分でディープ コピーを実装したくない場合は、シリアライゼーションを使用できます。循環依存関係を暗黙的かつ適切に処理するディープ コピーを実装します。

ディープ コピー、クローン、およびシャロー コピーに関する優れた記事は、ここにあります。

于 2013-03-22T13:05:52.143 に答える
0

これは、varAとVarBがプリミティブ型である場合にのみディープコピーになります。それらが参照型である場合、新しいオブジェクトはこれらのクラスの元のインスタンスと同じインスタンスを指します。

ディープコピーを実装する簡単な方法は、シリアル化を使用することです。Apache commons langは、このためのユーティリティメソッドを提供します(SerializationUtils.clone(foo))。

ただし、すべてのオブジェクトがシリアル化可能である必要があります。

そうでない場合は、最小限の開発作業でXStreamを使用してディープクローニングを行うことができます。

http://x-stream.github.io/

于 2013-03-22T13:33:44.990 に答える
0

ディープ コピーでは、コピーされたオブジェクトに他のオブジェクトが含まれている場合、その参照は再帰的にコピーされます

ここでもっと見る

于 2013-03-22T13:10:44.590 に答える
0

次の場合のみ:

  • クラス「myClass」には、varA と varB のみが含まれます。
  • クラス "myClass" にはスーパークラスがありません。
  • 変数 varA と varB は基本型 (つまり、String、int、long、...) です。それ以外の場合は、それらにも同じコピー プロセスを適用する必要があります。
于 2013-03-22T13:07:16.370 に答える
0

ディープ コピーは、オブジェクトが参照先のオブジェクトと共にコピーされるときに発生します。

int 型とContainObject 型のフィールドを持つMainObject1of型があるとします。MainObject1 のディープ コピーを実行すると、「field1」のコピーされた値を含む「field3」と、ContainObject1 のコピーされた値を含む「ContainObject2」を含む MainObject2 が作成されます。したがって、MainObject1 の ContainObject1 に加えられた変更は、MainObject2 にも適用されます。MainObject"field1""ContainObject1"not be reflected

実装で、ディープ コピーをシミュレートしようとしている場合は、次の 2 つの変数のみを使用する必要があります:varAvarBプリミティブ型のクラス。

于 2013-03-22T13:17:17.033 に答える
-1

次のプログラムの出力を観察します。
1> clone() メソッドなしで出力を参照してください。次のプログラムから clone() メソッドを削除します。(シャローコピーの例)
2> clone() メソッドで出力を見る。(ディープ コピーの例。ArrayList オブジェクトの出力を参照)

import java.util.ArrayList;
import java.util.List;

public class DeepCopy implements Cloneable {
    private List<String> hobbiesList;
    private int age;
    private String name;
    private float salary;

    public static void main(String[] args) throws CloneNotSupportedException {
        DeepCopy  original = new DeepCopy();
        original.name="AAA";
        original.age=20;
        original.salary=10000;
        original.hobbiesList = new ArrayList<String>();
        original.hobbiesList.add("Cricket");
        original.hobbiesList.add("Movies");
        original.hobbiesList.add("Guitar");
        original.hobbiesList.add("Eating");

        DeepCopy  cloned = (DeepCopy) original.clone();
        System.out.println("original:="+original);
        System.out.println("cloned  :="+cloned);
        System.out.println("After adding two more hobbies in 'original' which untimately reflected in 'cloned'");
        cloned.name="BBB";
        cloned.age=27;
        cloned.salary=18237;
        cloned.hobbiesList.add("Trecking");
        System.out.println("original       :="+original);
        System.out.println("cloned  changed:="+cloned);
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        DeepCopy clone = (DeepCopy)super.clone();
        clone.hobbiesList = new ArrayList<String>(clone.hobbiesList);
        return clone;
    }
    @Override
    public String toString() {
        return "My name is (String)"+name + " having age (int)"+age+". I earned (float)"+salary+" and hobbies are (ArrayList)"+hobbiesList;
    }
}
于 2013-03-22T13:16:29.633 に答える