番石榴前提条件checkNull,checkArgument
我想检查基类的先决条件,以便我知道子类型将始终使用有效的构造函数参数。
我们以构造函数为例说明:
在这种情况下,如何最好地使用番石榴前提条件?
在这样一个模拟例子中:(这是人为的!)
protected AbstractException(String errorMessage, Throwable errorCause) {
super(errorMessage, errorCause);
checkNotNull(errorMessage,
ErrorMessage.MethodArgument.CANNOT_BE_NULL_CHECK, "errorMessage");
checkArgument(!errorMessage.isEmpty(),
ErrorMessage.MethodArgument.CANNOT_BE_EMPTY_STRING_CHECK,
"errorMessage");
checkNotNull(errorCause, ErrorMessage.MethodArgument.CANNOT_BE_NULL_CHECK,
"errorCause");
}
我最终在检查参数之前调用super
,因为调用super
需要成为方法的第一行,虽然我可以执行super(checkNoNull(errorMessage))
,但我无法使用checkArgument
执行相同的包装,因为它返回void
。 所以困境是:
checkStringNotNullAndNotEmpty()
我使用了奇怪的ErrorMessage.MethodArgument.CANNOT_BE_NULL_CHECK,因为默认的throw
没有包含错误消息,所以从测试端我不能认识到这是一个参数验证失败而不是“任何”NPE?
我做错了什么吗?
这应该是一个评论,但它太长了。
super
无害。 更重要的是:你抛出的例外情况可能不如没有进行所有检查的情况。 想象一下,用户提供了一个原因,没有消息。 你认为这很糟糕,但是你用一个缺乏任何原因的NPE取而代之。 这更糟糕。
看看Guava的Preconditions.format
(私人包裹)。 他们可以首先检查正确的参数数量,但他们不会。 你可以提供太少或太多,这是一个错误,但忽略它是处理它的最好方法。