Когда я должен использовать Validate.isTrue Apache Commons и когда следует использовать ключевое слово 'assert'?
Когда я должен использовать Validate.isTrue Apache Commons, и когда следует использовать ключевое слово 'assert'?
Ответ 1
Утверждения могут быть отключены (на самом деле, они обычно есть), поэтому они не полезны для проверки ввода пользователя, например.
Ответ 2
Validate.isTrue и 'assert' выполняют совершенно разные цели.
утверждают,
Операторы утверждения Java обычно используются для документирования (посредством
утверждений), при каких обстоятельствах могут быть применены методы, и
что их абоненты могут ожидать после этого. Утверждения могут
опционально можно проверить во время выполнения, в результате чего AssertionError
исключение, если они не выполняются.
В терминах проектирования по контракту утверждения могут использоваться для определения пред- и постусловий, а также инварианты классов. Если во время выполнения они обнаружены не для хранения, это указывает на дизайн или реализацию проблема в системе.
Validate.isTrue
org.apache.commons.lang.Validate отличается. Он предлагает простой набор
JUnit-подобных методов, которые проверяют условие, и бросают
"IllegalArgumentException", если условие не выполняется.
Обычно он используется, когда открытый API должен быть толерантным к плохим вход. В этом случае его контракт может IllegalArgumentException при ошибочном вводе. Apache Validate предлагает удобное сокращение для реализации этого.
Так как выбрано исключение IllegalArgumentException, это не имеет смысла использовать Apache Validate для проверки постусловий или инвариантов. Аналогично, неверно использовать "assert" для проверки ввода пользователя, так как проверка выполнения может быть отключена во время выполнения.
Использование
Можно, однако, использовать оба одновременно, хотя и
для разных целей. В этом случае договор должен быть явно
требуют исключения IllegalArgumentException для определенных типов
ввода. Затем это выполняется через Apache Validate.
Инварианты и постусловия затем просто утверждаются, а также
как возможные дополнительные предпосылки (например, затрагивающие
состояние объекта). Например:
public int m(int n) {
// the class invariant should hold upon entry;
assert this.invariant() : "The invariant should hold.";
// a precondition in terms of design-by-contract
assert this.isInitialized() : "m can only be invoked after initialization.";
// Implement a tolerant contract ensuring reasonable response upon n <= 0:
// simply raise an illegal argument exception.
Validate.isTrue(n > 0, "n should be positive");
// the actual computation.
int result = complexMathUnderTrickyCircumstances(n);
// the postcondition.
assert result > 0 : "m result is always greater than 0.";
assert this.processingDone() : "processingDone state entered after m.";
assert this.invariant() : "Luckily the invariant still holds as well.";
return result;
}
Дополнительная информация:
- Бертран Мейер, "Применение дизайна по контракту", IEEE Computer, 1992 (pdf)
- Йохса Блох. Эффективная Java, 2-е изд., П. 38. Проверка параметров на достоверность. (google books)
Ответ 3
@thilo подходит для ключевого слова assert, но подумайте об утверждении типа spring Assert.
Смотрите ConditionalFailuresExplained из Guava.
- Предварительное условие. Вы перепутали (вызывающий).
- Утверждение "Я испортил".
- Проверка "Кто-то, от кого я зависим, перепутался".