我遇到一个问题,我必须依赖于由于构建器类中的无效参数而抛出异常,我想看看是否有更好的方法。这是我的情况:
我正在制作一种Command框架,其中单个命令由实现定义单个方法的Command接口的类定义
boolean execute(Object... args);
execute方法接受执行命令所需的参数,并且每个命令的参数都不同。为了避免在一堆instanceof和if-else树中检查每个参数类型,我做了一个复杂的Annotation结构,每个Command类应该定义一个名为CommandInfo的结构。这个注释定义了所有的参数以及它们期望的类类型,我正在这样做,以便完全基于CommandInfo注释保证提供给execute方法的参数是正确的。因此,为了实现这一点,我将命令参数的varArgs参数更改为名为Arguments的新类型。此Arguments类使用构建器模式,以便有一个私有构造函数,获取该类实例的唯一方法是调用构建器的“构建”方法。此Builder将一个实例接受Command所用的参数,以及要转换的字符串参数数组。构建方法是基于CommandInfo命令注释对所提供参数进行所有验证检查和转换的方法。
现在这一切都很有效,但我遇到的问题是在给出一组无效的参数时进行处理。通常,如果没有提供正确的变量,构建器类将抛出IllegalStateException,但这是运行时异常,通常用于编程错误。在我的例子中,给出一组无效的参数是很常见的,因此检查异常会更有意义。重要的是我在通知提供无效参数集的人类时默默地失败。
那么这里最好的选择是什么?当提供的参数无效时,我应该将一个新的已检查异常子类化为throw吗?我真的不想依赖于抛出异常,但由于我使用的是构建器模式,因此构建方法必须将实例返回给Arguments类。因此抛出异常是阻止实际构建Arguments实例的唯一方法。另外,我不想返回null因为我想避免NPE的
答案 0 :(得分:2)
我参与了一个有类似问题的项目。我们通过在ExResult中包装所有返回(甚至是void)来避免使用Exceptions来发送信号验证错误。当命令被返回时,我们会检查结果'尝试访问返回数据之前的成功/失败状态。这也允许您将附加信息附加到结果对象。
ExResult<Boolean> result = command.execute()
if (result.isSuccess()) {
Boolean resultData = result.getData();
} else {
//handle issue
result.getReason();
}
最初,当必须按顺序执行多个命令并依赖于先前的结果时,我们遇到了增长大条件树的问题。我们通过将先前的结果(如果有的话)附加到下一个命令来克服该问题,以便下一个命令可以确定是否要继续,以及将其自己的结果附加到结果对象。