重複の可能性:
Javaでオブジェクトをコピーするにはどうすればよいですか?
Javaでオブジェクト(たとえばA)を初期化し、その初期メンバー値を2番目のオブジェクト(たとえばB)と等しく設定するにはどうすればよいですか。初期化後、Bのメンバーを変更せずにAのメンバーを変更したい。したがって、AIの初期化では、Bのデータのみをコピーしたい。これはどのようにうまく行われるのか?
重複の可能性:
Javaでオブジェクトをコピーするにはどうすればよいですか?
Javaでオブジェクト(たとえばA)を初期化し、その初期メンバー値を2番目のオブジェクト(たとえばB)と等しく設定するにはどうすればよいですか。初期化後、Bのメンバーを変更せずにAのメンバーを変更したい。したがって、AIの初期化では、Bのデータのみをコピーしたい。これはどのようにうまく行われるのか?
クローンを実装して使用できます
MyClass b = new MyClass();
MyClass a = b.clone();
注:一部のクラスはクローン可能ではないか、実装が壊れています。たとえば、深いコピーである必要がある場合にのみ、浅いコピーを用意します。
クラスがの場合はSerializable
、メモリ内でシリアル化および逆シリアル化できます。正確ではありませんnice
が、機能します。
または、独自の「コピー」コンストラクターを作成することもできます。
クローン作成は、コピーのための簡単なオプションです。もっと制御が必要な場所で何かをしたい場合は、必要な方法でコピーを正確に実行する独自のメソッドを作成してください。
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 をコピーする場合は、次の操作を行う必要があります。
幸いなことに、これらは簡単な手順です。
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 オブジェクトを参照または値として...)。
要するに、あなたが望むのは、実行しやすいコピーです。単純な代入演算子は、プリミティブ型で値をコピーし、オブジェクトで参照をコピーします。
そのための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();
}
}
それはすべて、メンバーのタイプによって異なります。例を挙げます:
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);