2

重複の可能性:
Javaでオブジェクトをコピーするにはどうすればよいですか?

Javaでオブジェクト(たとえばA)を初期化し、その初期メンバー値を2番目のオブジェクト(たとえばB)と等しく設定するにはどうすればよいですか。初期化後、Bのメンバーを変更せずにAのメンバーを変更したい。したがって、AIの初期化では、Bのデータのみをコピーしたい。これはどのようにうまく行われるのか?

4

4 に答える 4

1

クローンを実装して使用できます

MyClass b = new MyClass();
MyClass a = b.clone();

注:一部のクラスはクローン可能ではないか、実装が壊れています。たとえば、深いコピーである必要がある場合にのみ、浅いコピーを用意します。

クラスがの場合はSerializable、メモリ内でシリアル化および逆シリアル化できます。正確ではありませんniceが、機能します。

または、独自の「コピー」コンストラクターを作成することもできます。

于 2012-06-28T16:16:24.820 に答える
0

クローン作成は、コピーのための簡単なオプションです。もっと制御が必要な場所で何かをしたい場合は、必要な方法でコピーを正確に実行する独自のメソッドを作成してください。

public MyType copy()
{
  MyType a = new MyType();
  // Initialize how you need to here, use the object this was called from if you'd like
  a.property = this.property;
  // etc.  
  return a;
}

これにより、より直接的な制御が可能になりますが、コーディングに時間がかかります。クローンが目的に合う場合は、それに固執してください。

編集:この回答に対するあなたのコメントに基づいて例を挙げます。

次のタイプがあるとします。

TypeA: has the following member variables
int number = 5; // Default value built in by constructor.
int letter = 'x'; // Value is 'a' when constructed but has been changed.
ArrayList<TypeB> list = {b1, b2, b3} // All are initialized.

TypeB: has the following member variables
double decimal = 5.32
TypeC someObject = ...

TypeC: has some stuff, but we are going to ignore it.

ここで、TypeA をコピーする場合は、次の操作を行う必要があります。

  1. 数値と文字は値型なので直接コピーします。
  2. いくつかの TypeB への参照を含む ArrayList への参照をコピーします。

幸いなことに、これらは簡単な手順です。

int copyNumber = this.number;
char copyChar = this.letter;
ArrayList<TypeB> copyList = this.list;
return new TypeA(copyNumber, copyChar, copyList);

ここでは、これら 3 つの引数を取る特定のコンストラクターを想定していますが、おわかりいただけたと思います。

ArrayList 内のすべての TypeB への参照ではなく、単に値を取得したい場合は注意が必要です。ArrayList をループして、すべての ITS 値をコピーした新しい TypeB を作成する必要があります (double および TypeC オブジェクトを参照または値として...)。

要するに、あなたが望むのは、実行しやすいコピーです。単純な代入演算子は、プリミティブ型で値をコピーし、オブジェクトで参照をコピーします。

于 2012-06-28T16:19:54.890 に答える
0

そのための1つの可能な解決策はclone、クラスにメソッドを実装し、次のようにクローンを使用することです:

MyClass a = new MyClass();
MyClass b = a;

これは実際にはパブリック メソッドでclone()はないので、公開する必要があります。さらに、オブジェクトが Cloneable であることを Java に伝える必要があります (これにより、クラスは実装されますCloneable)。次のコードはそれを示しています。

public class MyClass implements Cloneable {

    @Override
    protected MyClass clone() throws CloneNotSupportedException {
        return (MyClass)super.clone();
    }

}
于 2012-06-28T16:21:28.827 に答える
0

それはすべて、メンバーのタイプによって異なります。例を挙げます:

class A
{
    public float value;
    public int[] anArray;

    public A(B b)
    {
        //primitive may be assigned directly.
        this.value = b.value;

        // other types different approaches:

        //copy the contents of the array
        this.anArray = new int[b.anArray.length];
        System.arraycopy(b.anArray, 0, this.anArray, 0, b.anArray.length);
    }
}

class B
{
    float value;
    int[] anArray;
    public B(int size)
    {
        this.value = 3f;
        this.anArray = new int[size];
        for (int i = size - 1; i >= 0; i--)
        {
            this.anArray[i] = i * 10;
        }
    }
}

B b = new B(5);
A a = new A(b);
于 2012-06-28T16:33:50.490 に答える