Saya belum berada dalam situasi di mana kesalahan kompiler yang disebabkan oleh kata kunci ini akan menyelamatkan saya dari bug.
Ini tidak banyak untuk menyelamatkan penulis aplikasi dari bug untuk membiarkan penulis perpustakaan memutuskan bagian mana dari implementasi mereka berkomitmen untuk mempertahankan.
Jika saya punya perpustakaan
class C {
public void foo() { ... }
private void fooHelper() { /* lots of complex code */ }
}
Saya mungkin ingin dapat menggantikan foo
implementasi dan mungkin berubah fooHelper
secara radikal. Jika sekelompok orang telah memutuskan untuk menggunakan fooHelper
terlepas dari semua peringatan dalam dokumentasi saya maka saya mungkin tidak dapat melakukannya.
private
memungkinkan penulis perpustakaan memecah perpustakaan menjadi metode ukuran yang dapat dikelola (dan private
kelas pembantu) tanpa takut bahwa mereka akan dipaksa untuk mempertahankan detail internal tersebut selama bertahun-tahun.
Apa yang membuatnya berharga bagi kompiler untuk menegakkan penyembunyian informasi?
Di samping catatan, di Jawa private
tidak dipaksakan oleh kompiler, tetapi oleh verifier bytecode Java .
Bisakah refleksi mengalahkan mekanisme ini? Apa yang membuatnya berharga bagi kompiler untuk menegakkan penyembunyian informasi?
Di Jawa, tidak hanya refleksi yang dapat menimpa mekanisme ini. Ada dua macam private
di Jawa. Jenis private
yang mencegah satu kelas luar dari mengakses private
anggota kelas luar lain yang diperiksa oleh bytecode verifier, tetapi juga private
s yang digunakan oleh kelas dalam melalui metode accessor sintetis paket-swasta seperti dalam
public class C {
private int i = 42;
public class B {
public void incr() { ++i; }
}
}
Karena kelas B
(benar-benar bernama C$B
) menggunakan i
, kompiler menciptakan metode B
pengakses sintetis yang memungkinkan untuk mengakses C.i
dengan cara yang melewati verifikasi bytecode. Sayangnya, karena ClassLoader
memungkinkan Anda untuk membuat kelas dari a byte[]
, itu cukup sederhana untuk mendapatkan di privat yang C
telah terpapar ke kelas batin dengan membuat kelas baru C
di paket yang mungkin jika C
tabung belum disegel.
private
Penegakan yang tepat membutuhkan koordinasi antara classloader, bytecode verifier, dan kebijakan keamanan yang dapat mencegah akses reflektif ke privat.
Bisakah itu digunakan untuk mengamankan negara rahasia kelas dari serangan?
Iya nih. "Secure decomposition" adalah mungkin ketika programmer dapat berkolaborasi sementara masing-masing menjaga properti keamanan modul mereka - saya tidak harus mempercayai pembuat modul kode lain untuk tidak melanggar properti keamanan modul saya.
Bahasa Kemampuan Obyek seperti Joe-E menggunakan penyembunyian informasi dan cara lain untuk memungkinkan penguraian yang aman:
Joe-E adalah bagian dari bahasa pemrograman Java yang dirancang untuk mendukung pemrograman yang aman sesuai dengan disiplin kemampuan-objek. Joe-E dimaksudkan untuk memfasilitasi pembangunan sistem yang aman, serta untuk memfasilitasi tinjauan keamanan sistem yang dibangun di Joe-E.
Makalah yang ditautkan dari halaman itu memberikan contoh bagaimana private
penegakan memungkinkan dekomposisi yang aman.
Menyediakan enkapsulasi aman.
Gambar 1. Fasilitas logging hanya-append.
public final class Log {
private final StringBuilder content;
public Log() {
content = new StringBuilder();
}
public void write(String s) {
content.append(s);
}
}
Pertimbangkan Gbr. 1, yang mengilustrasikan bagaimana seseorang dapat membangun fasilitas log append-only. Asalkan sisa program ditulis dalam Joe-E, pengkaji kode dapat yakin bahwa entri log hanya dapat ditambahkan, dan tidak dapat dimodifikasi atau dihapus. Tinjauan ini praktis karena hanya memerlukan pemeriksaan Log
kelas, dan tidak memerlukan pemeriksaan kode lain. Akibatnya, memverifikasi properti ini hanya memerlukan alasan lokal tentang kode logging.