Rumah  >  Artikel  >  Java  >  Perkara Buat salinan pertahanan apabila perlu

Perkara Buat salinan pertahanan apabila perlu

王林
王林asal
2024-08-30 08:32:40748semak imbas

"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);
}

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
}

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:

Item  Faça cópias defensivas quando necessário

Item  Faça cópias defensivas quando necessário

Item  Faça cópias defensivas quando necessário

Item  Faça cópias defensivas quando necessário

Item  Faça cópias defensivas quando necessário

Atas ialah kandungan terperinci Perkara Buat salinan pertahanan apabila perlu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn