java.util.Objects.requireNonNull与Preconditions.checkNotNull的区别

23

Guava Preconditions 的文档指出:

使用 com.google.common 的项目通常应避免使用 Objects.requireNonNull(Object)。相反,应根据情况使用 checkNotNull(Object)Verify.verifyNotNull(Object) 中的任一方法(对于接受消息的重载也是如此)。

有人能解释一下这个建议的原理吗?

这是为了保持一致性还是 Objects.requireNonNull 的实现中存在根本性问题?

2个回答

19

这仅仅是为了保持一致性。实现方式是相同的。


1
直接从源头获取。谢谢! - vpiTriumph

14

尽管从问题中的示例看起来,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 等。


1
这是一个非常实用的补充,当选择Guava Preconditions而不是Java的requireNotNull时,绝对应该考虑它。 - vpiTriumph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接