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