"Anda harus memprogram secara defensif, dengan mengandaikan bahawa pelanggan kelas anda akan melakukan yang terbaik untuk memusnahkan invariannya"
Jawa sebagai bahasa selamat:
- Java menghalang ralat memori biasa dalam C/C++, tetapi tidak mengasingkan kelas sepenuhnya daripada interaksi yang tidak diingini dengan kelas lain.
- Pengaturcaraan defensif diperlukan, dengan mengandaikan bahawa pelanggan kelas mungkin cuba melanggar invariannya.
Kelas dan keselamatan tidak berubah:
- Contoh kelas "Tempoh" yang kelihatan tidak berubah tetapi boleh rosak disebabkan oleh kebolehubahan objek seperti Tarikh.
- Penyelesaian: Buat salinan defensif parameter boleh ubah apabila menerimanya dalam pembina.
public Period(Date start, Date end) {
this.start = new Date(start.getTime()); // Cópia defensiva
this.end = new Date(end.getTime());
if (this.start.compareTo(this.end) > 0)
throw new IllegalArgumentException(start + " after " + end);
}
Salin selepas log masuk
Salinan pertahanan dalam pembina:
- Salinan pertahanan mesti dibuat sebelum mengesahkan parameter untuk mengelakkan kelemahan (cth. serangan TOCTOU).
- Elakkan menggunakan klon() untuk salinan pertahanan objek yang berpotensi tidak dipercayai, lebih suka pembina statik atau kaedah kilang.
Pendapat dan kebolehubah:
- Isu: Getter boleh mendedahkan komponen dalaman boleh ubah, membenarkan mutasi luaran.
- Penyelesaian: Getters harus mengembalikan salinan pertahanan objek boleh ubah.
public Date getStart() {
return new Date(start.getTime()); // Cópia defensiva
}
Salin selepas log masuk
Aplikasi kepada kelas boleh ubah:
- Penyalinan defensif juga digunakan pada kelas boleh ubah yang menyimpan rujukan kepada objek boleh ubah yang dibekalkan pelanggan.
- Contoh: Apabila menyimpan objek dalam Set atau Peta, seseorang mesti mempertimbangkan sama ada objek itu boleh diubah suai kemudian.
Pemulangan komponen dalaman:
- Apabila mengembalikan dalaman boleh ubah, pertimbangkan untuk mengembalikan salinan pertahanan atau paparan tidak berubah.
Penggunaan objek tidak berubah:
- Apabila boleh, gunakan objek tidak berubah sebagai komponen dalaman untuk mengelakkan keperluan untuk salinan pertahanan.
Kos dan alternatif:
- Salinan pertahanan boleh memberi kesan kepada prestasi; Alternatif termasuk bergantung pada dokumentasi atau perjanjian penggunaan yang jelas.
- Dalam kes pemindahan kawalan yang jelas, seperti dalam corak reka bentuk (cth. pembungkus), salinan pertahanan boleh diketepikan.
Kesimpulan:
- Gunakan salinan pertahanan untuk melindungi integriti kelas, kecuali apabila kosnya tidak praktikal atau saling percaya diwujudkan dan dokumentasi yang jelas diperlukan.
Contoh daripada buku:
Atas ialah kandungan terperinci Perkara Buat salinan pertahanan apabila perlu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!