Javaにおいて、オブジェクトのコピーにはシャローコピーとディープコピーの2つの主要なアプローチがあります。これらのコピー手法にはいくつかの重要な違いがあります。
シャローコピー (Shallow Copy)
シャローコピーは、元のオブジェクトのフィールドの値をコピーしますが、フィールドが参照型である場合は参照そのものがコピーされます。つまり、オブジェクト内の参照先が同じままです。
public class ShallowCopyExample {
public static void main(String[] args) {
// オリジナルオブジェクトの作成
MyClass original = new MyClass(1, new int[]{2, 3});
// シャローコピー
MyClass shallowCopy = original.clone();
// フィールドの比較
System.out.println(original.equals(shallowCopy)); // true
// 参照型フィールドの比較
System.out.println(original.getData() == shallowCopy.getData()); // true
}
}
ディープコピー (Deep Copy)
ディープコピーは、元のオブジェクト自体とその中の全ての参照先オブジェクトまでを再帰的にコピーします。これにより、元のオブジェクトとコピー先のオブジェクトが別々のメモリ領域を使用します。
import java.util.Arrays;
public class DeepCopyExample {
public static void main(String[] args) {
// オリジナルオブジェクトの作成
MyClass original = new MyClass(1, new int[]{2, 3});
// ディープコピー
MyClass deepCopy = original.deepCopy();
// フィールドの比較
System.out.println(original.equals(deepCopy)); // true
// 参照型フィールドの比較
System.out.println(original.getData() == deepCopy.getData()); // false
}
}
オブジェクトのコピー方法を選択する際には、プログラムの要件とオブジェクトの構造に注意を払う必要があります。シャローコピーは簡潔で効率的ですが、ディープコピーはオブジェクトの状態を完全に分離するために使用されます。