【发布时间】:2012-10-09 17:01:40
【问题描述】:
我想检查基类的先决条件,以便我知道子类型将始终使用有效的构造函数参数。
我们以一个构造函数为例:
- 需要 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、fest 断言...)
我使用看起来很奇怪的 ErrorMessage.MethodArgument.CANNOT_BE_NULL_CHECK 因为默认的 throw 不包含错误消息,所以从测试方面我无法将其识别为参数验证失败而不是“任何”NPE?
我做错了吗?
【问题讨论】:
-
不是您问题的答案,但从其他异常的构造函数中抛出异常是个坏主意...
-
同意。我确实说“做作”。顺便说一句,如果你有一个框架,它只想看到异常被抛出一个错误消息集,你会怎么做?在这个例子中,我重新定义了一个需要消息的上限基数..
-
我们换个问题:如果
Exception发现不正确的构造函数参数,你会怎么做?您不能抛出验证异常,因为这将丢弃导致您抛出第一个异常的原始问题... -
如果框架的用户试图抛出框架异常,
AbstractException的子类,也就是说,与框架抛出的错误消息描述性不足(例如 null、""、...)在尝试创建异常以保护框架前提条件时(即所有异常都可以被记录,因为它们有消息,可以被过滤......过滤的一个例子是我需要一个非空检查来说明它是一:ErrorMessage.MethodArgument.CANNOT_BE_NULL_CHECK)