Я погуглив тему, але крім Вікіпедії я не знайшов жодної корисної документації чи статей.
Хто-небудь може пояснити мені простими словами, що це означає, або передати мені якусь приємну та зрозумілу документацію?
Я погуглив тему, але крім Вікіпедії я не знайшов жодної корисної документації чи статей.
Хто-небудь може пояснити мені простими словами, що це означає, або передати мені якусь приємну та зрозумілу документацію?
Відповіді:
Це не означає нічого конкретно стосовно Java.
Інваріант класу - це просто властивість, яка виконується для всіх екземплярів класу, завжди, незалежно від того, що робить інший код.
Наприклад,
class X {
final Y y = new Y();
}
X має інваріант класу, що існує y
властивість, і воно ніколи не є, null
і воно має значення типу Y
.
class Counter {
private int x;
public int count() { return x++; }
}
не підтримує двох важливих інваріантів
count
ніколи не повертає від’ємне значення через можливий недолік.count
суворо монотонно зростають.Модифікований клас зберігає ці два інваріанти.
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
але не вдається зберегти інваріант, який вимагає count
завжди нормального успіху (відсутні TCB-порушення † ), оскільки count
може викликати виняток або може заблокувати, якщо заблокований потік володіє монітором лічильника.
Кожна мова з класами полегшує підтримку одних інваріантів класів, а інших - не. Java не є винятком:
private
поля, тому інваріанти, які покладаються на приватні дані, легко підтримувати.null
цінностям підбиратись різними способами, тому важко підтримувати інваріанти "має справжнє значення".† - Зовнішнє порушення або порушення TCB - це подія, яка, з оптимізмом припускає дизайнер систем, не відбудеться.
Зазвичай ми просто довіряємо, що основне обладнання працює так, як рекламується, коли мова йде про властивості мов високого рівня, побудованих на них, і наші аргументи, які дотримуються інваріанти, не враховують можливості:
setAccessible
для зміни private
таблиць пошуку.Для деяких систем наш TCB може включати лише частини системи, тому ми можемо не припускати цього
але ми могли б припустити це
Чим система вищого рівня, тим більшим є її TCB, але чим більше ненадійних речей ви можете отримати з вашого TCB, тим більша ймовірність збереження ваших інваріантів, і тим надійнішою буде ваша система в довгостроковій перспективі.
count
справді "що ніколи не повертає одне і те ж значення двічі" вважається класом інваріантом?
Інваріант означає щось, що повинно дотримуватися своїх умов, незалежно від змін і того, хто його використовує / трансформує. Тобто властивість класу завжди виконує або задовольняє якусь умову навіть після перетворення за допомогою відкритих методів. Отже, клієнт або користувач цього класу має впевненість щодо класу та його властивостей.
Наприклад,
Це факти, які мають бути правдивими щодо класу екземпляра. Наприклад, якщо клас має властивість X, а інваріант може бути X, має бути більше 0. Наскільки мені відомо, немає вбудованого методу для підтримки інваріантів, ви повинні зробити властивості приватними та переконатися, що ваші геттери та сетери встановлюють властивість інваріантності.
Доступні анотації, які можуть перевіряти властивості за допомогою відбиття та перехоплювачів. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html