Я погуглил тему, но кроме Википедии я не нашел никакой другой полезной документации или статей.
Может ли кто-нибудь простыми словами объяснить мне, что это означает, или отослать меня к какой-нибудь красивой и простой для понимания документации?
Я погуглил тему, но кроме Википедии я не нашел никакой другой полезной документации или статей.
Может ли кто-нибудь простыми словами объяснить мне, что это означает, или отослать меня к какой-нибудь красивой и простой для понимания документации?
Ответы:
Это ничего особенного не означает применительно к 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