0

私はこれを持っています:

import java.util.ArrayList;


public class MyClass {
    ArrayList list = new ArrayList();

    public MyClass(){

    }

    public MyClass(MyClass aClass){
        this.list = aClass.getList();
    }

    public void add(int number){
        list.add(number);
    }

    public void set(int number){
        list.set(0, number);
    }

    public int get(){
        return (Integer)list.get(0);
    }

    public ArrayList getList(){
        return list;
    }
}



MyClass aName = new MyClass();
aName.add(5);
System.out.println("aName: "+aName.get());

MyClass aName2 = new MyClass(aName);
System.out.println("aName2: "+aName2.get());

aName2.set(1);
System.out.println("aName2: "+aName2.get());
System.out.println("aName: "+aName.get());

aName: 5 aName2: 5 aName2: 1 aName: 1

2 番目のオブジェクトで最初のオブジェクトの値を変更したくありません。これを止める方法はありますが、別のオブジェクトからプロパティをコピーすることはできますか?

4

4 に答える 4

1

次に、元のオブジェクトから新しいオブジェクトに List を渡さないでください。

public MyClass(MyClass aClass){ 
    this.list = aClass.getList(); 
} 

両方のオブジェクトが同じリストへの参照を持つようにします (両方のオブジェクト間で共有されるリストは 1 つだけです)。

やったほうがいい

public MyClass(MyClass aClass){ 
    this.list = (List) aClass.getList().clone(); 
} 
于 2012-07-26T19:39:06.450 に答える
1

はい、これを止めることができます。コピー コンストラクターでリストの防御コピーを作成する必要があります。

public MyClass(MyClass aClass){
    this.list = new ArrayList(aClass.getList());
}

を使用することもできますclone()が、Josh Bloch が効果的な Java 項目で述べているように、「コピー コンストラクターには多くの利点がありcloneます」 - 実際には、コピー コンストラクターの方が望ましいです。

于 2012-07-26T19:39:16.780 に答える
1

clone() またはコピーを取ることもできますが、すでにリストを作成しているので、リストを破棄するのではなく、それを使用できます。;)

public MyClass(MyClass aClass){
    this.list.addAll(aClass.getList());
}
于 2012-07-26T19:41:24.830 に答える
0

の参照値ArrayList新しいオブジェクトにコピーしています。これで、同じリストへの 2 つの参照ができました。

ArrayList2 番目のオブジェクトを作成するときに、新しいオブジェクトを作成する必要があります。

public MyClass(MyClass aClass){
    this.list = new ArrayList(aClass.getList());
}

ただし、両方のリストに同じオブジェクトが含まれていることに注意してください。繰り返しますが、これは新しいリストを作成し、元のリスト内のオブジェクトの参照値をコピーするだけです。一意のオブジェクトを含む 2 つの完全で別個のリストが必要な場合は、ディープ コピーを実行するメソッドを記述して、リスト内のオブジェクトも複製する必要があります。

于 2012-07-26T19:44:07.010 に答える