我想检查基类上的前提条件,以便知道子类型将始终使用有效的构造函数参数。
让我们以一个构造器为例:
在这种情况下,如何最好地使用番石榴前提条件方法?
在这样的模拟示例中:(这是人为的!)
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在检查参数之前先进行了调用,因为对to的调用必须super是方法的第一行,尽管可以这样做super(checkNoNull(errorMessage)),但是我不能使用相同的包装方法,checkArgument因为那会返回void。因此,难题是:
super
super(checkNoNull(errorMessage))
checkArgument
void
checkStringNotNullAndNotEmpty()
我使用外观怪异的ErrorMessage.MethodArgument.CANNOT_BE_NULL_CHECK,因为默认值throw不包含错误消息,因此从测试方面,我无法将其识别为参数验证失败,而不是“任何” NPE?
throw
我做错了吗?
这本来应该是一个评论,但是太长了。
更重要的是:您抛出的异常可能不如没有所有检查的异常。假设用户提供了一个原因并且没有消息。您认为这很糟糕,但是您可以使用没有任何原因的NPE替换它。更糟
看番石榴Preconditions.format(私人包装)。他们可以先检查正确数量的参数,但不能。您可以提供太少或太多,这是一个错误,但忽略它是处理它的最佳方法。
Preconditions.format