java.util.Objects.requireNonNull vs Preconditions.checkNotNull

时间:2016-01-07 02:42:59

标签: java guava

Guava Preconditions笔记的文档:

  

使用Objects.requireNonNull(Object)的项目通常应避免使用   checkNotNull(Object)。相反,使用其中任何一个   Verify.verifyNotNull(Object)Objects.requireNonNull适合{。}}   情况。 (对于接收消息的重载也是如此。)

有人可以解释这个建议的理由吗?

是出于保持一致的目的还是Config的实施存在根本性的错误?

2 个答案:

答案 0 :(得分:12)

这只是为了保持一致性。实现是相同的。

答案 1 :(得分:8)

虽然从问题中的例子来看,OP似乎是专门询问checkNotNull的特定形式,但总的来说还有一个微妙的差异,支持使用checkNotNull,这反映在printf样式varargs形式。例如,使用Guava Preconditions,您可以执行以下操作:

public void getInput(String companyName) {
   String context = "Google";
   String moreContext = "Facebook";
   checkNotNull(companyName, "Why not try %s or %s", context, moreContext);
}

使用Objects.requireNonNull,您必须执行类似

的操作
public void getInput(String companyName) {
   String context = "Google";
   String moreContext = "Facebook";
   requireNonNull(companyName, "Why not try " + context + " or " + moreContext);
}

参考:请参阅Preconditions Explained

的底部
  

简单,varargs“printf-style”异常消息。 (这个优点也是我们建议继续在JDK 7中引入的Objects.requireNonNull上继续使用checkNotNull的原因。)

编辑: 需要注意的一点是,使用String.valueOf(arg)将errorMessageTemplate的所有参数转换为String,因此您只能使用%s而不能使用%d或%f等其他类型说明符。