Я искал тему, но кроме Wikipedia Я не нашел никакой дополнительной полезной документации или статей.
Может кто-нибудь объяснить мне простыми словами, что это значит или передать мне какую-нибудь красивую и понятную документацию?
Я искал тему, но кроме Wikipedia Я не нашел никакой дополнительной полезной документации или статей.
Может кто-нибудь объяснить мне простыми словами, что это значит или передать мне какую-нибудь красивую и понятную документацию?
Это не означает ничего, особенно в отношении 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, тем вероятнее, что ваши инварианты будут удерживаться, и чем более надежной будет ваша система в долгосрочной перспективе работать.
Это факты, которые должны быть верны в отношении класса экземпляра. Например, если класс имеет свойство X, а инвариант может быть X, то он должен быть больше 0. Насколько я знаю, нет встроенного метода для сохранения инвариантов, вы должны сделать свойства частными и убедиться, что ваши геттеры и сеттеры обеспечивают свойство инвариантности.
Существуют доступные аннотации, которые могут проверять свойства с использованием отражения и перехватчиков. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html
Инвариант означает то, что должно придерживаться его условий независимо от того, что изменится, или того, кто его использует/трансформирует. Иными словами, свойство класса всегда удовлетворяет или удовлетворяет некоторому условию даже после прохождения преобразований с использованием общедоступных методов. Таким образом, клиент или пользователь этого класса обеспечивается в отношении класса и его свойства.
Например,