Saya mencari topik tersebut di Google, tetapi selain Wikipedia, saya tidak menemukan dokumentasi atau artikel berguna lainnya.
Adakah yang bisa menjelaskan kepada saya dengan kata-kata sederhana apa artinya atau merujuk saya ke beberapa dokumentasi yang bagus dan mudah dimengerti?
java
terminology
invariants
Saurabh Kumar
sumber
sumber
Jawaban:
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 pernahnull
dan memiliki nilai tipeY
.class Counter { private int x; public int count() { return x++; } }
gagal mempertahankan dua invarian penting
count
tidak pernah mengembalikan nilai negatif karena kemungkinan aliran bawah.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 † ) karenacount
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:
private
kolomnya, sehingga invarian yang mengandalkan data pribadi mudah dikelola.null
nilai-nilai menyelinap dalam banyak cara, jadi sulit untuk mempertahankan invarian "memiliki nilai nyata".† - 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:
setAccessible
untuk mengubahprivate
tabel pencarian.Untuk beberapa sistem, TCB kami mungkin hanya menyertakan beberapa bagian dari sistem, jadi kami mungkin tidak berasumsi demikian
tapi kita mungkin berasumsi seperti itu
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.
sumber
count
tidak pernah mengembalikan nilai yang sama dua kali" benar-benar dianggap sebagai invarian kelas?Invariant berarti sesuatu yang harus tetap pada kondisinya tidak peduli apapun perubahannya atau siapapun yang menggunakan / mengubahnya. Artinya, properti kelas selalu memenuhi atau memenuhi beberapa kondisi bahkan setelah melalui transformasi dengan menggunakan metode publik. Jadi, klien atau pengguna kelas ini dipastikan tentang kelas dan propertinya.
Sebagai contoh,
sumber
Itu adalah fakta yang harus benar tentang kelas instance. Misalnya jika sebuah kelas memiliki properti X dan invarian dapat X harus lebih besar dari 0. Sepengetahuan saya tidak ada metode bawaan untuk mempertahankan invarian, Anda harus membuat properti menjadi pribadi dan memastikan pengambil dan penyetel Anda menerapkan properti invarian.
Ada anotasi yang tersedia yang dapat memeriksa properti menggunakan refleksi dan interseptor. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html
sumber