我想检查基类的先决条件,以便我知道子类型将始终使用有效的构造函数参数。
让我们以一个构造函数为例:
- 接受 2 个或更多参数
- 接受不同类型的参数
- 对于一个参数,它会执行多项检查(例如,字符串不为空且不为空)
在这种情况下,如何最好地使用 Guava 前置条件方法?
在这样的模拟示例中:(这是人为的!)
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
。所以困境是:
- 我在哪里检查所有论点?我不想为此创建一个 Builder
- 我如何像虚构的那样“分组”检查
checkStringNotNullAndNotEmpty()
- 我应该考虑与匹配器框架集成吗?(hamcrest,节日断言......)
我使用看起来很奇怪的 ErrorMessage.MethodArgument.CANNOT_BE_NULL_CHECK 因为默认值throw
不包含错误消息,所以从测试方面我无法将其识别为参数验证失败而不是“任何”NPE?
我做错了吗?