Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Deep Copy vs Shallow Copy ใน Java

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 อื่นๆ

เมื่อไหร่ใช้แบบไหน?

  • Shallow: Immutable objects, หรือต้องการ share state
  • Deep: Mutable objects ที่ต้องแยก state ให้ชัดเจน
วิธีคำอธิบาย
Copy ConstructorConstructor ที่รับ instance เดียวกัน copy field ทุกตัว
Cloneable + clone()implements Cloneable, override clone() ทำ deep copy เอง
Serializationserialize → deserialize (ช้า แต่ deep copy อัตโนมัติ)
Jackson/GsontoJson → fromJson (สำหรับ POJO)
MapStruct/DozerMapping library สำหรับ DTO