Java 设计问题。为非法参数引发已检查的异常

Java 设计问题。为非法参数引发已检查的异常,java,Java,我有一个问题,由于构建器类中的无效参数,我不得不依赖于抛出异常,我想看看是否有更好的方法。以下是我的情况: 我正在制作一种命令框架,其中一个命令由一个类定义,该类实现了一个命令接口,该接口定义了一个方法 boolean execute(Object... args); execute方法接受执行命令所需的参数,每个命令的参数都不同。为了避免在instanceof和if-else树的混乱中检查每个参数类型,我创建了一个复杂的注释结构,每个命令类都应该定义它,称为CommandInfo。此注释定义

我有一个问题,由于构建器类中的无效参数,我不得不依赖于抛出异常,我想看看是否有更好的方法。以下是我的情况:

我正在制作一种命令框架,其中一个命令由一个类定义,该类实现了一个命令接口,该接口定义了一个方法

boolean execute(Object... args);
execute方法接受执行命令所需的参数,每个命令的参数都不同。为了避免在instanceof和if-else树的混乱中检查每个参数类型,我创建了一个复杂的注释结构,每个命令类都应该定义它,称为CommandInfo。此注释定义了所有参数及其预期的类类型,我这样做是为了确保提供给execute方法的参数完全基于CommandInfo注释是正确的。为此,我将命令参数的varArgs参数更改为名为arguments的新类型。这个Arguments类利用构建器模式,因此有一个私有构造函数,获取类实例的唯一方法是调用构建器的build方法。此生成器获取参数将用于的命令的实例,以及要转换的字符串参数数组。build方法是基于CommandInfo注释对提供的参数进行所有验证检查和转换的方法

现在所有这些都很有效,但我遇到的问题是如何处理给定的无效参数集。通常,构建器类在未提供正确的变量时会抛出IllegalStateException,但这是一个运行时异常,通常用于编程错误。在我的例子中,给出一组无效的参数是很常见的,因此检查异常更有意义。重要的是,在通知提供无效参数集的人员时,我会默默地失败


那么我最好的选择是什么呢?当提供的参数无效时,我是否应该将一个新的checked异常子类化以抛出?我真的不想依赖于抛出异常,但由于我使用的是构建器模式,构建方法必须向Arguments类返回一个实例。因此,抛出异常是停止实际构建Arguments实例的唯一方法。另外,我不想返回null,因为我想避免NPE的

我在一个有类似问题的项目上工作过。通过将所有返回(甚至是void)包装到ExResult中,我们避免了使用异常来表示验证错误。当返回命令时,我们将在尝试访问返回数据之前检查结果的成功/失败状态。这还允许您将其他信息附加到结果对象

ExResult<Boolean> result = command.execute()
if (result.isSuccess()) {
    Boolean resultData = result.getData();
} else {
    //handle issue
    result.getReason();
}
ExResult=command.execute()
if(result.issucess()){
布尔resultData=result.getData();
}否则{
//处理问题
result.getReason();
}

最初,当多个命令必须顺序执行并且依赖于以前的结果时,我们遇到了生长大型条件树的问题。我们通过将上一个结果(如果有的话)附加到下一个命令来克服这个问题,这样下一个命令就可以确定是否要继续,并将自己的结果附加到结果对象。

是否可以重载
execute()
首先要避免这种情况吗?不,因为命令接口是由API提供的,而该API是验证命令参数的。每个命令子类都是通过API注册的,API无法执行子类的重载方法。。。因为您似乎希望客户端能够从中恢复,并且您不能返回
null
对象,所以选中的异常听起来似乎可以工作。另一种可能是返回一个空对象,但我猜这不符合您的需要。哦,这提醒了我JavaScript承诺了这么多。。。顺便说一句,这是一个挖掘其他建筑模式的提示。这让我思考,最后我做了一些非常类似的事情。谢谢
ExResult<Boolean> result = command.execute()
if (result.isSuccess()) {
    Boolean resultData = result.getData();
} else {
    //handle issue
    result.getReason();
}