我想检查基类的前置条件,以便我知道子类型将始终使用有效的构造函数参数。
我们以一个构造函数为例:
在这种情况下,如何最好地使用番石榴先决条件方法?
在这样的模拟示例中:(这是做作的!)
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?
我做错了吗?
答案 0 :(得分:1)
这应该是一个评论,但它太长了。
super
是无害的,只要超级ctor不执行它不应该做的事情。更重要的是:你抛出的例外情况可能不如你没有进行所有检查所得到的情况。想象一下,用户提供原因而没有消息。你认为这很糟糕,但你用缺乏任何原因的NPE取而代之。那更糟。
看看Guava的Preconditions.format
(包私有)。他们可以先检查正确的参数数量,但事实并非如此。您可以提供太少或太多,这是一个错误,但忽略它是处理它的最佳方式。