Javaオブジェクトのディープコピーの実装方法
Java では、オブジェクトのディープコピーを実現する方法は次のとおりです。
- Object.clone()メソッドを使用:Objectクラスは保護されたclone()メソッドを提供し、オブジェクトの浅いコピーを作成するために使用できます。深いコピーを実装する場合は、コピーするオブジェクトクラスにCloneableインターフェイスを実装し、clone()メソッドをオーバーライドする必要があります。clone()メソッドでは、新しいオブジェクトを作成し、元のオブジェクトの属性値を新しいオブジェクトの属性に割り当てます。
例としてコード:
public class MyClass implements Cloneable {
private int id;
private String name;
// 构造方法
// getter和setter方法
@Override
protected Object clone() throws CloneNotSupportedException {
MyClass cloned = (MyClass) super.clone();
// 对于引用类型的属性,需要进行深拷贝
cloned.name = this.name.clone();
return cloned;
}
}
- シリアライズ可能なインターフェイスを実現する:オブジェクトをバイトストリームにシリアライズし、バイトストリームを新しいオブジェクトにデシリアライズします。この方法では、オブジェクトのすべてのメンバー変数がシリアライズ可能である必要があります。
サンプルコード:
import java.io.*;
public class MyClass implements Serializable {
private int id;
private String name;
// 构造方法
// getter和setter方法
public MyClass deepCopy() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (MyClass) ois.readObject();
}
}
- サードパーティーのライブラリを使用:Apache CommonsのSerializationUtilsクラスなどのサードパーティーのライブラリを使用すると、オブジェクトのディープコピーの実装が可能です。
それはネイティブには非常に簡単な文です。
import org.apache.commons.lang3.SerializationUtils;
public class MyClass {
private int id;
private String name;
// 构造方法
// getter和setter方法
public MyClass deepCopy() {
return SerializationUtils.clone(this);
}
}
元のオブジェクトのメンバ変数が不変型(基本データ型、Stringなど)の場合は、ディープコピーを行う必要はなく、直接代入できます。可変型(配列、コレクション、その他のカスタムクラスなど)の場合は、新しいオブジェクトと元のオブジェクトの属性値が相互に影響を受けないように、ディープコピーを実行する必要があります。