java.util.Objects.requireNonNull vs Preconditions.checkNotNull

vpi*_*mph 14 java guava

Guava Preconditions的文档说明:

使用的项目com.google.common一般应避免使用 Objects.requireNonNull(Object).取而代之的是,无论使用何种的 checkNotNull(Object)或者Verify.verifyNotNull(Object)是适当的情况.(对于接收消息的重载也是如此.)

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

这是为了保持一致性还是存在根本性的错误Objects.requireNonNull

Lou*_*man 14

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


Aja*_*dav 11

虽然从问题中的例子来看,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);
}
Run Code Online (Sandbox Code Playgroud)

Objects.requireNonNull你将不得不这样做

public void getInput(String companyName) {
   String context = "Google";
   String moreContext = "Facebook";
   requireNonNull(companyName, "Why not try " + context + " or " + moreContext);
}
Run Code Online (Sandbox Code Playgroud)

参考:参见前提条件说明的底部部分

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

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