Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该何时使用Apache Commons';Validate.isTrue,我应该在什么时候使用';断言';关键词?_Java_Validation_Assert_Apache Commons - Fatal编程技术网

Java 我应该何时使用Apache Commons';Validate.isTrue,我应该在什么时候使用';断言';关键词?

Java 我应该何时使用Apache Commons';Validate.isTrue,我应该在什么时候使用';断言';关键词?,java,validation,assert,apache-commons,Java,Validation,Assert,Apache Commons,我什么时候应该使用Apache Commons'Validate.isTrue,什么时候应该只使用'assert'关键字?断言可以关闭(事实上,它们通常是关闭的),因此它们对验证用户输入没有用处,例如 Validate.isTrue和“assert”的用途完全不同 断言 Java的断言语句通常用于文档化(通过 在什么情况下可以调用方法,以及 他们打电话的人事后所期望的是真实的。这些断言可能是错误的 可以选择在运行时进行检查,从而产生断言错误 例外情况,如果他们不持有 在契约式设计方面,断言可用于

我什么时候应该使用Apache Commons'Validate.isTrue,什么时候应该只使用'assert'关键字?

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

Validate.isTrue和“assert”的用途完全不同

断言
Java的断言语句通常用于文档化(通过 在什么情况下可以调用方法,以及 他们打电话的人事后所期望的是真实的。这些断言可能是错误的 可以选择在运行时进行检查,从而产生断言错误 例外情况,如果他们不持有

在契约式设计方面,断言可用于定义 前置和后置条件以及类不变量。如果在运行时 这些被检测到不成立,这意味着一个设计或实现 系统中的问题

验证.isTrue
org.apache.commons.lang.Validate则不同。它提供了一个简单的设置 检查条件并抛出 如果条件不成立,“IllegalArgumentException”

它通常用于公共API应能容忍坏消息的情况 输入。在这种情况下,其合同可以承诺抛出 输入错误时出现IllegalArgumentException。Apache验证提供 这是实现此功能的方便快捷方式

因为抛出了一个IllegalArgumentException,所以它没有意义 使用Apache的Validate检查后置条件或不变量。 同样,使用“断言”进行用户输入验证也是不正确的, 因为可以在运行时禁用断言检查

同时使用这两种方法
尽管如此,同时使用两者是可能的 为了不同的目的。在这种情况下,合同应明确规定: 要求对某些类型引发IllegalArgumentException 输入的数量。然后通过apachevalidate实现。 不变量和后置条件也被简单地断言 尽可能多的附加先决条件(例如影响 对象的状态)。例如:

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;
}
public int m(int n){
//类不变量应该在输入时保持不变;
断言此.invariant():“该不变量应保持不变。”;
//合同设计的前提条件
断言此。isInitialized():“m只能在初始化后调用。”;
//执行宽容的合同,确保在n 0时做出合理的响应,“n应为正”);
//实际计算。
int result=complexMathUnderTrickyEnvironment(n);
//后条件。
断言结果>0:“m的结果始终大于0。”;
断言此.processingDone():“在m.之后输入的processingDone状态”;
断言此.invariant():“幸运的是,该不变量仍然有效。”;
返回结果;
}
更多信息:

  • Bertrand Meyer,“合同设计的应用”,IEEE计算机,1992()
  • 乔苏亚·布洛赫。有效Java,第二版,第38项。检查参数的有效性。()

@ TILO对于AsStEt关键字是正确的,但是考虑像Spring Asvest.S/P>之类的断言。 看看番石榴

  • 先决条件“你把(来电者)搞砸了。”
  • 断言“我搞砸了。”
  • 验证“我所依赖的人把事情搞砸了。”

Johsua Bloch的可能复制品。有效Java,第23项:检查参数的有效性。本书第3版第49项。