クラスabcの2つのオブジェクトがあるとしましょう
abc obj = new abc(10,20);
// 2 つの var の値を設定します。x と y と言う
abc obj1 = obj;
// 同じメモリを指しているので同じ値
しかし、あるオブジェクトの値を別のオブジェクトに割り当てる方法があれば、両方とも diff があります。メモリー。アドレスではなく値をコピーしたいだけです。どんなオペレーターか何かがそれを行うことができますか?
メソッドを使用できますclone()
(サブクラスがjava.lang.Cloneable
インターフェースを実装していると仮定します)
abc obj1 = obj.clone()
のデフォルトの動作はclone()
、オブジェクトの浅いコピーを返すことに注意してください。これは、元のオブジェクトのすべてのフィールドの値が新しいオブジェクトのフィールドにコピーされることを意味します (他のオブジェクトのグラフ全体を通過するわけではありません)。
シリアル化および逆シリアル化できるオブジェクトを「ディープコピー」したいと思います。
ディープ コピーは、オブジェクトの各フィールドの個別のコピーを作成し、コピーされるオブジェクトによって参照される他のオブジェクトのグラフ全体を再帰します。
詳細:
http://javatechniques.com/blog/faster-deep-copies-of-Java-objects/
clone() メソッドを使用する場合、Cloneable インターフェイスを実装し、このメソッドの独自の実装を作成する必要があります。クラスにコピーコンストラクタを作って使ったほうがいいと思います。
例えば:
public class YourClass() {
private int prop1;
private int prop2;
...
// Getters and setters for properties.
...
// Default constructor
public YourClass() {
}
// Copy constructor
public YourClass(YourClass instance) {
this.prop1 = instance.getProp1();
this.prop2 = instance.getProp2();
// The same for other methods
}
}
これは、StackOverflowの複製とコピー コストラクタとファクトリ メソッドに関する良い投稿です。
「演算子のオーバーロード」を使用してみてください。私は知っています、私は知っています、Javaにはそれがありませんが、それはあなたがそれを「使う」ことを止めるものではありません。
あなたがする必要があるのは、次のとおりです。
obj1.copy(obj2);
そして abc の宣言の中で
public void copy(abc other) {
var1 = other.var1;
var2 = other.var2;
}
これは単なる記憶によるものであり、テストされていないことを強調したいと思いますが、機能しない理由はわかりません。
別の方法として、「clone()」を使用できますが、クラス内の「参照」が複製されることに注意してください。手動でやったほうがいいです、本当に。
「コピー」を上書きすることで、サブクラスが正しくコピーされていることを確認することもできます。
Object クラスの clone メソッドを使用します。
MyClass mobj = new MyClass("Vivek");
MyClass mobj1 = mobj.clone();
しかし、ディープクローニングのために使用してみてくださいSerialization and Deserialization
clone メソッドを使用する必要があります。クローンのデフォルトの動作はシャロー コピーです。
ディープ クローニングを使用します。クラスにCloneable Interfaceabc
を実装し、実装します。clone()
abc obj = new abc(10,20); // setting the values of two var. say x and y
abc obj1 = obj.clone();
Cloning
クラス構造によって異なります。以下の例のような単純なクラスを検討する場合。
class ABC implements Cloneable {
private int a;
private int b;
public int getA() {
return a;
}
public ABC(int a, int b) {
super();
this.a = a;
this.b = b;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
メインでテストするとfalseが返されます。
public static void main(String[] args) throws CloneNotSupportedException {
ABC a = new ABC(1, 2);
ABC b = (ABC) a.clone();
System.out.println(a == b);
}
新しいオブジェクトを構築する必要があります。他の人が指摘しているように、Cloneable
andを実装することでこれを達成できclone()
ますが、元のオブジェクトが保持するデータから新しいオブジェクトを作成するコンストラクターまたはファクトリ メソッドを実装することで、新しいオブジェクトを明示的に作成することもできます。
実装に大きな違いはありませんが、明示的なインスタンス化の方がエラーが発生しにくいことがわかります。
Josh Bloch は、Effective Java でこれについて詳しくコメントしています。版によっては、第 3 章の項目 10または項目 11 です。