Pembuat Salinan Java

1. Perkenalan

Konstruktor salinan di kelas Java adalah konstruktor yang membuat objek menggunakan objek lain dari kelas Java yang sama .

Itu berguna saat kita ingin menyalin objek kompleks yang memiliki beberapa bidang, atau saat kita ingin membuat salinan mendalam dari objek yang sudah ada.

2. Cara Membuat Pembuat Salinan

Untuk membuat konstruktor salinan, pertama-tama kita dapat mendeklarasikan konstruktor yang mengambil objek berjenis sama sebagai parameter:

public class Employee { private int id; private String name; public Employee(Employee employee) { } }

Kemudian, kami menyalin setiap bidang objek masukan ke dalam contoh baru:

public class Employee { private int id; private String name; public Employee(Employee employee) { this.id = employee.id; this.name = employee.name; } }

Apa yang kita miliki di sini adalah salinan dangkal , yang baik-baik saja karena semua bidang kita - int dan String dalam hal ini - adalah tipe primitif atau tipe yang tidak dapat diubah.

Jika kelas Java memiliki bidang yang bisa berubah, maka kita bisa membuat salinan dalam di dalam konstruktor salinannya. Dengan deep copy, objek yang baru dibuat tidak bergantung pada aslinya karena kami membuat salinan berbeda dari setiap objek yang bisa berubah:

public class Employee { private int id; private String name; private Date startDate; public Employee(Employee employee) { this.id = employee.id; this.name = employee.name; this.startDate = new Date(employee.startDate.getTime()); } }

3. Salin Pembuat vs. Klon

Di Java, kita juga bisa menggunakan metode clone untuk membuat objek dari objek yang sudah ada. Namun, konstruktor salinan memiliki beberapa keunggulan dibandingkan metode klon :

  1. Konstruktor salinan jauh lebih mudah untuk diterapkan. Kita tidak perlu mengimplementasikan antarmuka Cloneable dan menangani CloneNotSupportedException .
  2. The clone Metode mengembalikan umum Object referensi. Oleh karena itu, kita perlu melakukan typecast ke jenis yang sesuai.
  3. Kami tidak dapat menetapkan nilai ke bidang akhir dalam metode klon . Namun, kita dapat melakukannya di konstruktor salinan.

4. Masalah Warisan

Copy konstruktor di Java tidak dapat diwariskan oleh subclass. Oleh karena itu, jika kita mencoba untuk menginisialisasi objek anak dari referensi kelas induk, kita akan menghadapi masalah pengecoran saat mengkloningnya dengan konstruktor salinan.

Untuk menggambarkan masalah ini, pertama-tama mari buat subclass Employee dan copy konstruktornya:

public class Manager extends Employee { private List directReports; // ... other constructors public Manager(Manager manager) { super(manager.id, manager.name, manager.startDate); this.directReports = directReports.stream() .collect(Collectors.toList()); } } 

Kemudian, kami mendeklarasikan variabel Karyawan dan membuat instance dengan konstruktor Manajer :

Employee source = new Manager(1, "Baeldung Manager", startDate, directReports);

Karena jenis referensi adalah Karyawan , kita harus mentransmisikannya ke jenis Manajer sehingga kita dapat menggunakan konstruktor salinan dari kelas Manajer :

Employee clone = new Manager((Manager) source);

Kita mungkin mendapatkan ClassCastException saat runtime jika objek input bukan merupakan instance dari kelas Manajer .

Satu cara untuk menghindari casting di konstruktor salinan adalah dengan membuat metode baru yang diwariskan untuk kedua kelas:

public class Employee { public Employee copy() { return new Employee(this); } } public class Manager extends Employee { @Override public Employee copy() { return new Manager(this); } }

Di setiap metode kelas, kami memanggil konstruktor salinannya dengan input dari objek ini . Dengan cara ini, kami dapat menjamin bahwa objek yang dihasilkan sama dengan objek pemanggil:

Employee clone = source.copy();

5. Kesimpulan

Dalam tutorial ini, kami menunjukkan cara membuat konstruktor salinan dengan beberapa contoh kode. Juga, kami membahas beberapa alasan mengapa kami harus menghindari metode klon .

Copy constructor memiliki masalah pengecoran saat kita menggunakannya untuk mengkloning objek kelas anak yang jenis referensinya adalah kelas induk. Kami memberikan satu solusi untuk masalah ini.

Seperti biasa, kode sumber untuk tutorial tersedia di GitHub.