Bagaimana Menerapkan Shallow Copy dan Deep Copy di Java



Artikel ini akan memberi Anda pengetahuan terperinci dan komprehensif tentang Salinan Dangkal dan Salinan Dalam di Java dengan Contoh.

Kloning adalah proses membuat replika atau salinan objek, metode klon Java.lang.Object digunakan untuk membuat salinan atau replika objek. objek java yang mengimplementasikan antarmuka Cloneable memenuhi syarat untuk menggunakan metode klon. Pada artikel kali ini, kita akan membahas Shallow Copy dan Deep Copy dengan urutan sebagai berikut:

Membuat Salinan Objek Java

Kita dapat membuat replika atau salinan objek java dengan





1. Membuat salinan objek di lokasi memori yang berbeda. Ini disebut salinan dalam.

mengatur classpath java di linux

2. Membuat referensi baru yang menunjuk ke lokasi memori yang sama. Ini juga disebut salinan Dangkal.



Salinan dangkal

Implementasi default dari metode klon membuat salinan dangkal dari objek sumber, itu berarti turunan baru dari tipe Objek dibuat, ini menyalin semua bidang ke contoh baru dan mengembalikan objek baru tipe 'Objek'. Objek ini secara eksplisit perlu menjadi typecast dalam tipe objek objek sumber.

Objek ini akan memiliki salinan persis dari semua bidang objek sumber termasuk tipe primitif dan referensi objek. Jika objek sumber berisi referensi apa pun ke objek lain di lapangan maka dalam contoh baru hanya akan memiliki referensi ke objek tersebut, salinan objek tersebut tidak dibuat. Ini berarti jika kita membuat perubahan pada salinan dangkal maka perubahan akan tercermin di objek sumber. Kedua contoh tidak independen.

Metode klon di kelas Objek dilindungi di alam, jadi tidak semua kelas bisa menggunakan metode clone (). Anda perlu mengimplementasikan antarmuka Cloneable dan mengganti metode clone. Jika antarmuka Cloneable tidak diimplementasikan maka Anda akan mendapatkan CloneNotSupportedException.super.clone () akan mengembalikan salinan dangkal sesuai implementasi di kelas Object.



Kode untuk Salinan Dangkal

paket kelas com.test Departemen {String empId Kelas string Penunjukan string Departemen publik (String empId, Nilai string, Penunjukan string) {this.empId = empId this.grade = grade this.designation = designation}} class Karyawan mengimplementasikan Cloneable {int id Nama string Departemen dept publik Karyawan (int id, Nama string, Departemen departemen) {this.id = id this.name = name this.dept = dept} // Versi default dari metode clone (). Ini menciptakan salinan objek yang dangkal. Objek yang dilindungi clone () melempar CloneNotSupportedException {return super.clone ()}} kelas publik ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Membuat tiruan dari emp1 dan menugaskannya ke emp2 emp2 = (Karyawan) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Mencetak penunjukan 'emp1' System.out.println (emp1.dept.designation) // Output: AVP // Mengubah penunjukan 'emp2' emp2.dept.designation = 'Director' // Perubahan ini akan tercermin di asli Karyawan 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Keluaran:

Output-Shallow-Copy

ukuran array dalam javascript

Dalam contoh di atas, kami memiliki kelas Karyawan emp1 yang memiliki tiga variabel kelas id (int), nama (String) dan departemen (Departemen).

Kami sekarang mengkloning emp1 ke emp2 untuk membuat salinan dangkal, setelah itu kami mengubah penunjukan menggunakan objek emp2 dan memverifikasi bahwa perubahan yang sama juga tercermin di emp1.


Deep Copy

Salinan dalam dari suatu objek akan memiliki salinan persis dari semua bidang objek sumber seperti salinan dangkal, tetapi tidak seperti salinan pucat jika objek sumber memiliki referensi ke objek sebagai bidang, maka replika objek dibuat dengan memanggil klon metode. Ini berarti bahwa objek sumber dan tujuan tidak bergantung satu sama lain. Perubahan apa pun yang dibuat pada objek kloning tidak akan memengaruhi objek sumber.

Kode untuk Deep Copy

paket com.test class Departemen mengimplementasikan Cloneable {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Versi default dari clone () metode. objek terlindungi clone () melempar CloneNotSupportedException kelas {return super.clone ()}} Karyawan mengimplementasikan Cloneable {int id Nama string Departemen dept publik Karyawan (int id, Nama string, Departemen departemen) {this.id = id this.name = name this.dept = dept} // Mengganti metode clone () untuk membuat salinan mendalam dari sebuah objek. objek terlindungi clone () melempar CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Department dept1 = new Department ('1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Membuat tiruan dari emp1 dan menugaskannya ke emp2 emp2 = (Karyawan) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Mencetak penunjukan 'emp1' System.out.println (emp1.dept.designation) // Output: AVP / / Mengubah penunjukan 'emp2' emp2.dept.designation = 'Director' // Perubahan ini akan tercermin di asli Employee 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

Keluaran:

Dalam contoh Deep copy di atas, tidak seperti salinan dangkal, objek sumber dan tujuan tidak bergantung satu sama lain. Setiap perubahan yang dilakukan di emp2 tidak akan memengaruhi emp1.

Perbedaan Antara Salinan Dangkal dan Salinan Dalam

Salinan dangkal Deep Copy
Objek kloning dan objek sumber tidak sepenuhnya terputus-putusObjek kloning dan objek sumber sepenuhnya tidak bergantung satu sama lain.
Perubahan yang dibuat dalam instance yang digandakan akan memengaruhi variabel referensi dari objek sumberPerubahan yang dibuat pada instance yang digandakan tidak akan memengaruhi variabel referensi dari objek sumber.
Versi default klon adalah salinan dangkalUntuk membuat salinan dalam kita perlu mengganti metode klon kelas Object.
Salinan dangkal lebih disukai jika variabel kelas objek hanya berjenis primitif sebagai bidangSalinan dalam lebih disukai jika variabel kelas objek memiliki referensi ke objek lain sebagai bidang.
Ini relatif cepatIni relatif lambat.

Dengan ini, kita sampai pada akhir artikel Salinan Dangkal dan Salinan Dalam. Saya harap Anda mendapatkan pemahaman tentang berbagai perbedaan di antara keduanya.

tutorial sql server untuk pemula dengan contoh

Lihat oleh Edureka, perusahaan pembelajaran online tepercaya dengan jaringan lebih dari 250.000 pelajar yang puas dan tersebar di seluruh dunia. Kursus pelatihan dan sertifikasi Java J2EE dan SOA Edureka dirancang untuk siswa dan profesional yang ingin menjadi Pengembang Java.

Ada pertanyaan untuk kami? Harap sebutkan di bagian komentar di blog 'Salinan Dangkal dan Salinan Dalam' ini dan kami akan menghubungi Anda kembali secepatnya.