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 fooimplementasi dan mungkin berubah fooHelpersecara radikal. Jika sekelompok orang telah memutuskan untuk menggunakan fooHelperterlepas dari semua peringatan dalam dokumentasi saya maka saya mungkin tidak dapat melakukannya.
privatememungkinkan penulis perpustakaan memecah perpustakaan menjadi metode ukuran yang dapat dikelola (dan privatekelas 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 privatetidak 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 privatedi Jawa. Jenis privateyang mencegah satu kelas luar dari mengakses privateanggota kelas luar lain yang diperiksa oleh bytecode verifier, tetapi juga privates 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 Bpengakses sintetis yang memungkinkan untuk mengakses C.idengan cara yang melewati verifikasi bytecode. Sayangnya, karena ClassLoadermemungkinkan Anda untuk membuat kelas dari a byte[], itu cukup sederhana untuk mendapatkan di privat yang Ctelah terpapar ke kelas batin dengan membuat kelas baru Cdi paket yang mungkin jika Ctabung belum disegel.
privatePenegakan 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 privatepenegakan 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.