Guava Preconditions 的文档指出:
使用
com.google.common
的项目通常应避免使用Objects.requireNonNull(Object)
。相反,应根据情况使用checkNotNull(Object)
或Verify.verifyNotNull(Object)
中的任一方法(对于接受消息的重载也是如此)。
有人能解释一下这个建议的原理吗?
这是为了保持一致性还是 Objects.requireNonNull
的实现中存在根本性问题?
Guava Preconditions 的文档指出:
使用
com.google.common
的项目通常应避免使用Objects.requireNonNull(Object)
。相反,应根据情况使用checkNotNull(Object)
或Verify.verifyNotNull(Object)
中的任一方法(对于接受消息的重载也是如此)。
有人能解释一下这个建议的原理吗?
这是为了保持一致性还是 Objects.requireNonNull
的实现中存在根本性问题?
这仅仅是为了保持一致性。实现方式是相同的。
尽管从问题中的示例看起来,OP似乎是在特定询问checkNotNull
的形式,但使用checkNotNull
更有利的另一个微妙差别通常反映在printf
样式的可变参数形式中。例如,使用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底部的章节。
简单易用的可变参数“printf风格”异常消息。(这也是为什么我们建议继续使用checkNotNull而不是在JDK 7中引入的Objects.requireNonNull的原因。)
编辑:
需要注意的一点是,errorMessageTemplate 中的所有 args 都将使用 String.valueOf(arg)
转换为字符串,因此只能使用 %s 而不能使用其他类型说明符,如 %d 或 %f 等。
requireNotNull
时,绝对应该考虑它。 - vpiTriumph