Ini tidak berarti apa-apa secara khusus terkait dengan java.
Sebuah invarian kelas hanyalah properti yang menampung semua instance kelas, selalu, apa pun yang dilakukan kode lain.
Sebagai contoh,
class X {
final Y y = new Y();
}
X memiliki kelas invarian bahwa ada y
properti dan tidak pernah null
dan memiliki nilai tipe Y
.
class Counter {
private int x;
public int count() { return x++; }
}
gagal mempertahankan dua invarian penting
- Itu
count
tidak pernah mengembalikan nilai negatif karena kemungkinan aliran bawah.
- Panggilan
count
itu meningkat secara monoton.
Kelas yang dimodifikasi mempertahankan kedua invarian tersebut.
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
tetapi gagal untuk mempertahankan invarian yang memanggil untuk count
selalu berhasil secara normal (tidak ada pelanggaran TCB † ) karena count
dapat memunculkan pengecualian atau mungkin memblokir jika thread yang mengalami kebuntuan memiliki monitor penghitung.
Setiap bahasa dengan kelas memudahkan untuk mempertahankan beberapa kelas invarian tetapi tidak yang lain. Java tidak terkecuali:
- Kelas Java secara konsisten memiliki atau tidak memiliki properti dan metode, sehingga invarian antarmuka mudah dipelihara.
- Kelas Java dapat melindungi
private
kolomnya, sehingga invarian yang mengandalkan data pribadi mudah dikelola.
- Kelas Java bisa bersifat final, sehingga invarian yang bergantung pada tidak adanya kode yang melanggar invarian dengan membuat subkelas berbahaya dapat dipertahankan.
- Java memungkinkan
null
nilai-nilai menyelinap dalam banyak cara, jadi sulit untuk mempertahankan invarian "memiliki nilai nyata".
- Java memiliki utas yang berarti bahwa kelas yang tidak disinkronkan mengalami masalah dalam mempertahankan invarian yang bergantung pada operasi sekuensial dalam utas yang terjadi bersamaan.
- Java memiliki pengecualian yang membuatnya mudah untuk mempertahankan invarian seperti "mengembalikan hasil dengan properti p atau tidak mengembalikan hasil" tetapi lebih sulit untuk mempertahankan invarian seperti "selalu mengembalikan hasil".
† - Pelanggaran eksternalitas atau TCB adalah peristiwa yang diasumsikan oleh perancang sistem secara optimis tidak akan terjadi.
Biasanya kami hanya percaya bahwa perangkat keras dasar berfungsi seperti yang diiklankan ketika berbicara tentang properti bahasa tingkat tinggi yang dibangun di atasnya, dan argumen kami yang dipegang oleh invarian tidak memperhitungkan kemungkinan:
- Seorang programmer menggunakan kait debug untuk mengubah variabel lokal karena program berjalan dengan cara yang tidak bisa dilakukan oleh kode.
- Rekan Anda tidak menggunakan refleksi dengan
setAccessible
untuk mengubah private
tabel pencarian.
- Loki mengubah fisika menyebabkan prosesor Anda salah membandingkan dua angka.
Untuk beberapa sistem, TCB kami mungkin hanya menyertakan beberapa bagian dari sistem, jadi kami mungkin tidak berasumsi demikian
- Administrator atau daemon dengan hak istimewa tidak akan menghentikan proses JVM kami,
tapi kita mungkin berasumsi seperti itu
- Kami dapat memeriksa ke sistem file transaksi yang andal.
Semakin tinggi level suatu sistem, semakin besar TCB-nya, tetapi semakin tidak dapat diandalkan hal-hal yang dapat Anda keluarkan dari TCB, semakin besar kemungkinan invarian Anda ditahan, dan semakin andal sistem Anda dalam jangka panjang.