我应该何时使用Apache Commons的Validate.isTrue,何时应该使用'assert'关键字?
答案 0 :(得分:32)
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's 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;
}
更多信息:
答案 1 :(得分:2)
可以关闭断言(事实上,它们通常是这样),因此它们对于验证用户输入没有用处。
答案 2 :(得分:2)
@thilo适用于assert关键字,但请考虑像Spring Assert这样的Assertion。
请参阅Guava的ConditionalFailuresExplained。