我何时应该使用Apache Commons的Validate.isTrue,何时应该使用'assert'关键字?

时间:2011-02-19 05:55:05

标签: java validation assert apache-commons

我应该何时使用Apache Commons的Validate.isTrue,何时应该使用'assert'关键字?

3 个答案:

答案 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;
}

更多信息:

  • Bertrand Meyer,“按合同设计”,IEEE计算机,1992年(pdf
  • Johsua Bloch。 Effective Java ,第2版,第38项。检查参数的有效性。 (google books

答案 1 :(得分:2)

可以关闭断言(事实上,它们通常是这样),因此它们对于验证用户输入没有用处。

答案 2 :(得分:2)

@thilo适用于assert关键字,但请考虑像Spring Assert这样的Assertion。

请参阅Guava的ConditionalFailuresExplained

  • 前提条件&#34;你搞砸了(来电)。&#34;
  • 断言&#34;我搞砸了。&#34;
  • 验证&#34;我依赖的人搞砸了。&#34;