Pembina Salin Java

1. Pengenalan

Pembina salinan dalam kelas Java adalah konstruktor yang membuat objek menggunakan objek lain dari kelas Java yang sama .

Itu berguna ketika kita ingin menyalin objek kompleks yang mempunyai beberapa bidang, atau ketika kita ingin membuat salinan mendalam dari objek yang ada.

2. Cara Membuat Salinan Pembina

Untuk membuat salinan konstruktor, pertama kita dapat menyatakan konstruktor yang mengambil objek dengan jenis yang sama seperti parameter:

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

Kemudian, kami menyalin setiap bidang objek masukan ke 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 ada di sini adalah salinan cetek , yang baik kerana semua bidang kita - int dan tali dalam kes ini - sama ada jenis primitif atau jenis yang tidak berubah.

Sekiranya kelas Java mempunyai bidang yang dapat diubah, maka kita dapat membuat salinan mendalam di dalam konstruktor salinannya. Dengan salinan mendalam, objek yang baru dibuat tidak bergantung kepada yang asli kerana kami membuat salinan yang berbeza dari setiap objek yang dapat diubah:

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 Konstruktor vs Klon

Di Jawa, kita juga dapat menggunakan metode klon untuk membuat objek dari objek yang ada. Walau bagaimanapun, penyusun salinan mempunyai beberapa kelebihan berbanding kaedah klon :

  1. Pembina salinan jauh lebih mudah dilaksanakan. Kami tidak perlu melaksanakan antara muka Cloneable dan menangani CloneNotSupportedException .
  2. The klon Cara mengembalikan umum Objek rujukan. Oleh itu, kita perlu menaipkannya ke jenis yang sesuai.
  3. Kami tidak dapat memberikan nilai ke medan akhir dalam kaedah klon . Walau bagaimanapun, kita boleh melakukannya dalam penyusun salinan.

4. Isu Warisan

Pembina salinan di Java tidak dapat diwarisi oleh subkelas. Oleh itu, jika kita cuba menginisialisasi objek anak dari rujukan kelas induk, kita akan menghadapi masalah pemutus ketika mengklonnya dengan penyusun salinan.

Untuk menggambarkan masalah ini, mari kita buat subkelas Kakitangan dan pembina salinannya:

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 mengisytiharkan pemboleh ubah Karyawan dan mewujudkannya dengan pembina Pengurus :

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

Oleh kerana jenis rujukan adalah Karyawan , kita harus memasukkannya ke jenis Pengurus supaya kita dapat menggunakan salinan konstruktor Pengurus kelas:

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

Kami mungkin mendapat ClassCastException pada waktu runtime jika objek input bukan contoh kelas Manager .

Salah satu cara untuk mengelakkan penyalinan dalam konstruktor salinan adalah dengan membuat kaedah baru yang boleh diwarisi untuk kedua-dua kelas:

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

Dalam setiap kaedah kelas, kami memanggil konstruktor salinannya dengan input objek ini . Dengan cara ini, kita dapat menjamin bahawa objek yang dihasilkan sama dengan objek pemanggil:

Employee clone = source.copy();

5. Kesimpulan

Dalam tutorial ini, kami menunjukkan cara membuat salinan konstruktor dengan beberapa contoh kod. Kami juga membincangkan beberapa sebab mengapa kami harus mengelakkan kaedah klon .

Salin konstruktor mempunyai masalah casting ketika kita menggunakannya untuk mengklon objek kelas anak yang jenis rujukannya adalah kelas induk. Kami memberikan satu penyelesaian untuk masalah ini.

Seperti biasa, kod sumber untuk tutorial tersedia di GitHub.