Guava Preconditions笔记的文档:
使用
Objects.requireNonNull(Object)
的项目通常应避免使用checkNotNull(Object)
。相反,使用其中任何一个Verify.verifyNotNull(Object)
或Objects.requireNonNull
适合{。}} 情况。 (对于接收消息的重载也是如此。)
有人可以解释这个建议的理由吗?
是出于保持一致的目的还是Config
的实施存在根本性的错误?
答案 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等其他类型说明符。