番石榴验证的目的是什么?

Mor*_*rad 6 java guava

我们什么时候的目的是com.google.common.base.Verify什么com.google.common.base.Preconditions?

本Verify类看起来不错,但它有一个@Beta注释,我应该使用它?

mcj*_*s45 9

Torquestomp的答案是错误的(尽管它的时间可能是正确的,但我不知道).请参阅gauva的wiki条目:条件失败的种类.

前提

前置条件检查确保公共方法的调用者遵守方法规范的要求.例如,sqrt函数可能只接受非负参数.

验证

如果您对自己使用的API缺乏高信度将满足其(实际或隐含)规范,则会使用验证检查.最容易理解这种类型的检查"就像几乎所有方面的断言一样,但必须在生产中保持启用状态."

不要过分担心.来自guava API文档:

在某些情况下,[前提条件和验证]之间的差异可能很微妙.当不清楚使用哪种方法时,不要过于担心 ; 只需选择一些看似合理的东西就行了.

  • 公平地说,与接受的答案相比,这是一个非常微妙的差异.如果您明确地调出接受的答案错误的位置,那将非常有用. (2认同)

tor*_*omp 7

区别在于语义.验证用于确保不变量不会发生变化,已设计为执行某项操作的代码实际上正在执行该操作.在精神上:

int x = divide(10, 5);
Verify.verify(x == 2, "X should be 2");
Run Code Online (Sandbox Code Playgroud)

另一方面,当错误的输入传递到程序的某个部分时,前提条件会失败,通常是从用户到代码,或从客户端代码传递到另一个库中的代码.在精神上:

public int divide(int x, int y) {
  Preconditions.checkArgument(y != 0, "Can't divide by 0!");
  return x / y;
}
Run Code Online (Sandbox Code Playgroud)

至于你是否应该使用@Beta类,这完全取决于你构建的应用程序的范围和可预见的使用寿命,并单独询问,可能会被标记为"主要意见为基础"的问题.

  • @Beta问题在Guava主页上得到解答:"如果您的代码本身就是一个库(即它在您自己控制之外的用户的CLASSPATH上使用),则不应使用beta API,除非您重新打包它们(例如使用ProGuard的)." (4认同)