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

1981

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

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.

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.

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