java.util.Objects.requireNonNull vs Preconditions.checkNotNull

2022-09-02 03:39:40

番石榴前提条件的文档指出:

使用的项目通常应避免使用 。相反,请使用适合情况的任何或。(消息接受重载也是如此。com.google.commonObjects.requireNonNull(Object)checkNotNull(Object)Verify.verifyNotNull(Object)

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

是出于一致性的目的,还是实施中存在根本性错误?Objects.requireNonNull


答案 1

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


答案 2

虽然从问题中的例子来看,OP似乎专门询问了的特定形式,但在一般情况下,还有一个更微妙的区别,它反映在样式varargs形式中。例如,您可以使用执行以下操作:checkNotNullcheckNotNullprintfGuava 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);
}

参考:请参阅前提条件的底部解释

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

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


推荐