Shallow Copy (Shadow Copy)
สร้าง object ใหม่ แต่ copy reference** ของ field ที่เป็น object/array → object เดิมและ copy ชี้ไปยังข้อมูลเดียวกัน
ตัวอย่าง
import java.util.*;
class Demo {
private int[] data;
public Demo(int[] vals) {
this.data = vals; // shallow: ชี้ array เดียวกัน
}
public void display() {
System.out.println(Arrays.toString(data));
}
}
public class UseDemo {
public static void main(String[] args) {
int[] vals = {56, 89, 91};
Demo original = new Demo(vals);
original.display(); // [56, 89, 91]
vals[0] = 65; // เปลี่ยน array ต้นฉบับ
original.display(); // [65, 89, 91] ← เปลี่ยนตาม!
}
}
Deep Copy
สร้าง object ใหม่ และ copy ข้อมูลทุกระดับ (recursive) → object เดิมและ copy แยกจากกันสมบูรณ์
ตัวอย่าง (Manual Deep Copy)
class Demo {
private int[] data;
public Demo(int[] vals) {
// Deep copy: allocate array ใหม่ copy ค่าแต่ละตัว
this.data = new int[vals.length];
for (int i = 0; i < vals.length; i++) {
this.data[i] = vals[i];
}
}
public void display() {
System.out.println(Arrays.toString(data));
}
}
public class UseDemo {
public static void main(String[] args) {
int[] vals = {56, 89, 91};
Demo original = new Demo(vals);
original.display(); // [56, 89, 91]
vals[0] = 65; // เปลี่ยน array ต้นฉบับ
original.display(); // [56, 89, 91] ← ไม่เปลี่ยน!
}
}
วิธีทำ Deep Copy อื่นๆ
| วิธี | คำอธิบาย |
|---|---|
| Copy Constructor | Constructor ที่รับ instance เดียวกัน copy field ทุกตัว |
| Cloneable + clone() | implements Cloneable, override clone() ทำ deep copy เอง |
| Serialization | serialize → deserialize (ช้า แต่ deep copy อัตโนมัติ) |
| Jackson/Gson | toJson → fromJson (สำหรับ POJO) |
| MapStruct/Dozer | Mapping library สำหรับ DTO |