Javaにおいて、オブジェクトのコピーには主にシャローコピーとディープコピーの2つの方法があります。これらのコピー手法にはいくつかの違いがあります。
シャローコピー (Shallow Copy)
シャローコピーは、元のオブジェクトのフィールドの値を新しいオブジェクトにコピーする方法ですが、フィールドの参照先が同じままです。つまり、オブジェクト内の参照型のフィールドが存在する場合、それらのフィールドは元のオブジェクトとコピー先のオブジェクトで同じインスタンスを指します。
public class ShallowCopyExample {
public static void main(String[] args) {
Person originalPerson = new Person("John", new Address("123 Main St"));
// シャローコピー
Person copiedPerson = originalPerson.shallowCopy();
// 参照型のフィールドは同じインスタンスを指す
System.out.println(originalPerson.getAddress() == copiedPerson.getAddress()); // true
}
}
ディープコピー (Deep Copy)
ディープコピーは、元のオブジェクトのすべてのフィールドを新しいオブジェクトにコピーする方法で、参照型のフィールドも新しいインスタンスを作成してコピーします。これにより、元のオブジェクトとコピー先のオブジェクトが完全に独立した状態となります。
public class DeepCopyExample {
public static void main(String[] args) {
Person originalPerson = new Person("John", new Address("123 Main St"));
// ディープコピー
Person copiedPerson = originalPerson.deepCopy();
// 参照型のフィールドも新しいインスタンスを指す
System.out.println(originalPerson.getAddress() == copiedPerson.getAddress()); // false
}
}
注意点として、ディープコピーは性能の面でシャローコピーに比べてコストが高いため、使用する際には十分な検討が必要です。どちらの方法を選択するかは、コピー先のオブジェクトが元のオブジェクトと同じ参照を共有しても問題ないかどうかに依存します。