Hỏi khó – Java Clone hoạt động như thế nào?

439

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Java Clone là một trong 5 cách khởi tạo mới một Object. Tại sao chúng ta lại cần nó?. Hãy cùng tìm hiểu qua bài viết dưới đây:

1. Từ câu chuyện của reference variable.

Không cần quá phức tạp, ngay từ ban đầu, ta sẽ tự đặt câu hỏi rằng:

“Nếu muốn sao chép một Object A, chẳng phải cứ gán A = B là được sao?, cần gì tới Java Clone”

  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java
  10 tips để trở thành Java Developer xịn hơn

Xem thêm các việc làm Java lương cao trên TopDev

Rất tiếc, câu trả lời là không. Đối với C++, phép gán này sẽ cho ra một Object mới, hoàn toàn độc lập với Object cũ. Nhưng Java thì không làm được, nếu sử dụng phép toán ==, java sẽ tạo ra một biến tham chiếu (reference variable) -> không tạo ra một object mới.

Thực chất, trường hợp sử dụng Operator equal hay toán tử New, Java đều trỏ tới cùng một địa chỉ trên memory. Object được tạo ra có thể bị thay đổi nếu object mà nó reference trước đó thay đổi.

Để dễ hiểu hơn, ta cùng xem xét ví dụ dưới đây:

import java.io.*; 

// Class Test, nơi chưa object ta muốn clone.
class Test 
{ 
int x, y; 
Test() 
{ 
x = 10; 
y = 20; 
} 
} 

// Main Class
class Main 
{ 
public static void main(String[] args) 
{ 
// Tạo object ob1
Test ob1 = new Test(); 

System.out.println(ob1.x + " " + ob1.y); 

// Tạo mới reference variable cho ob2 
// Thực chất Object ob2 trỏ tới cùng một địa chỉ với Object ob1 
Test ob2 = ob1; 

// Bất cứ thay đổi nào ở Object 2 cũng đều reflect tới Object 1
// in ob1 
ob2.x = 100; 

System.out.println(ob1.x+" "+ob1.y); 
System.out.println(ob2.x+" "+ob2.y); 
} 
}

Output:

10 20
100 20
100 20

2. Java clone ra đời.

3. Sử dụng như thế nào?.

Để có thể sử dụng method clone, có hai thứ cần làm:

  • Class chúng ta muốn Clone nhất thiết phải implement Cloneable interface. Nếu không, JVM sẽ throw exception CloneNotSupportedException khi ta gọi method clone() trong Object.
  • Trường hợp muốn gọi clone() ở class cha, sử dụng super.clone().

4. Shallow copy và deep copy.

4.1 Shallow copy

Shallow copy is method of copying an object and is followed by default in cloning. In this method the fields of an old object X are copied to the new object Y. While copying the object type field the reference is copied to Y i.e object Y will point to same location as pointed out by X. If the field value is a primitive type it copies the value of the primitive type.

Shallow copy là một method copy object, đây là phương thức được sử dụng mặc định trong cloning. Ở method này, các field của object X được copy tới object Y. Trong quá trình sao chép, cả Object X và Y đều cùng trỏ tới một địa chỉ. Trường hợp field value được copy là kiểu nguyên thủy -> giá trị của Object sẽ được copy.

Chính vì cả 2 Object X và Y đều trỏ về cùng 1 địa chỉ -> trường hợp có thay đổi giá trị ở Object cha, giá trị sẽ thay đổi luôn ở Object con. Tuy cũng sử dụng Java Clone, nhưng Shallow có chi phí khởi tạo (memory) thấp hơn.

Shallow copies are cheap and simple to make.

Shallow copies được tạo ra tương đối đơn giản, chi phí để tạo ra một Object được copy theo kiểu này cũng không quá cao.

4.2 Deep copy

Phương thức chính được sử dụng trong Java Clone là clone(). Phương thức này sử dụng Deep copy, ta sẽ sử dụng method clone(). Khi sử dụng clone(), một Object được tạo ra. Nhưng khi có sự thay đổi về giá trị ở Object cha -> sự thay đổi sẽ không reflect (phản án) tới Object con.

If we want to create a deep copy of object X and place it in a new object Y then new copy of any referenced objects fields are created and these references are placed in object Y. This means any changes made in referenced object fields in object X or Y will be reflected only in that object and not in the other.

Nếu bạn muốn tạo một deep copy của object X và biến nó trở thành một Object mới Y. Tất cả những thay đổi ở Object X sẽ chỉ được phản ánh cho chính nó. Các giá trị còn lại ở Object Y đã clone sẽ không thay đổi.

5. Tham khảo.

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev