Hỏi khó – Java Clone hoạt động như thế nào?
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”
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.
Để 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.
- Java Stream – Collectors và Statistics – KieBlog
- Geeksforgeeks – Clone in Java.
- Java Cloning – Copy Constructors vs. Cloning.
- Object Cloning in java.
Bài viết gốc được đăng tải tại kieblog.vn
Có thể bạn quan tâm:
- Những projects giúp nâng hạng Front-end Developer
- Marker Interface trong Java
- CDN là gì? – CDN hoạt động như thế nào?
Xem thêm Việc làm IT hấp dẫn trên TopDev
- T Từ khóa final trong Java
- R RxJava – Thời đại lập trình Reactive programming ứng dụng Android đã tới
- J Java roadmap cho newbie – Từ số 0 đến chuyên nghiệp
- T Top các Framework Java Backend phổ biến cho anh em Developer
- T Tìm hiểu về lớp HashMap trong Java: Các hoạt động và cách dùng
- L Lập trình Android bằng Java: Hướng dẫn toàn diện
- J Java Super là gì? Sự khác biệt giữa Java Super và Java thông thường
- K Khai báo phương thức overloading trong Java
- J Java Sleep: Kỹ thuật ngủ luồng trong lập trình Java
- S Sử dụng subString trong xử lý văn bản trong Java