6

ディープコピーを行う場合は、明らかに参照をコピーしないでください。ただし、コピーされるオブジェクトに、それ自体が同じオブジェクトへの参照であるオブジェクトが含まれている場合は、それを維持するか、データをコピーするだけにする必要があります。

public class Program() {
    public void Main(String[] args) {
        Person person = new Person();
        person.setName("Simon");

        List<Person> people = new ArrayList<Person>();
        people.add(person);
        people.add(person);
        people.add(person);

        List<Person> otherPeople = magicDeepCopyFunction(people);

        otherPeople.get(0).setName("Adam");

        // should this output 'Adam' or 'Simon'?
        System.out.println(otherPeople.get(1)); 
    }
}

私は両方の議論を見ることができますが、私はコンセンサスが何であったか疑問に思っています。

4

3 に答える 3

3

真のディープコピーは、参照ツリーのずっと下にあるすべてのコピーを作成します。

BがAのディープコピーである場合、Aに加えた変更はBを介して表示されません。

ほとんどのディープコピーアルゴリズムは、あなたの例では、の3つのメンバーすべてpeopleが同じへの参照であることに気付かないでしょうperson。典型的なディープコピーアルゴリズムは、3つの新しいPersonオブジェクトを作成します。

ただし、信頼性の高いプログラミング(非常に厳密に定義されたデータ構造を除く)が難しく、実行時にコストがかかるため、真のディープコピーを表示することはそれほど一般的ではありません。

于 2012-08-21T16:13:14.973 に答える
2

これは、データ構造がどのように機能するかについての期待によって異なります。

通常、参照は元の参照と同じくらい一般的になります。つまり、正当な理由で同じオブジェクトへの参照が2つあると想定する必要があります。誤ったデータ構造の回避策として、同じオブジェクトの2つのコピーを作成することを期待するべきではありません。

于 2012-08-21T16:11:42.713 に答える
2

Simonの+1magicDeepCopyFunction()の呼び出しを見た場合、本当に深いコピーを期待します。別のレベルの関係やサイクルなどがある可能性があるため、はるかに防御的で実装が困難です。実際には何をしたいかによって異なりますが、メソッドのディープコピーを呼び出すと、他の誰かがそれをブラックボックスとして使用する可能性があります。リスクなし。

于 2012-08-21T16:14:07.390 に答える