当前位置: 首页 > 知识库问答 >
问题:

一个同时具有变量返回类型和变量输入参数的java方法

陈淳
2023-03-14

我有一个抽象的java类“BaseOperation”。此类只有一个抽象方法:

public abstract T execute()
{
    ...

    return T;
}

BaseOperation的子类必须实现此方法:

public class GetUsersOperation extends BaseOperation<GetUsersResponse>
{
    ...

    @Override
    public GetUsersResponse execute()
    {

        ...

        return GetUsersResponse;
    }

}

这是将所有常见的“操作”逻辑放在BaseAction类中的好方法,但仍然让每个具体子类的执行()方法都有不同的返回类型。

现在我需要更改此结构以允许执行()方法具有可变数量的参数。例如,一个具体的子类需要:

execute(String, int)

另一个需要:

execute(Date, Date, String)

这很棘手,因为execute方法是在基类中声明的。简单地重载基中的execute方法并不理想。首先,超载的数量将是巨大的。其次,每个子类只会使用其中一个execute方法,其他所有方法的意义是什么?

在我看来,最简单的解决方案是用varargs声明execute方法:

execute(Object... arguments)

然后向下转换子类中的所有参数:

execute(Object... arguments)
{
    String s = (String) arguments[0];
    ...
}

显然,这有两大缺点:

  • 由于所有向下转换操作,性能降低
  • 调用执行()方法不再是严格类型的,因为任何数量的对象都可以在没有编译器警告的情况下传递。

是否有模式或其他解决方案可以没有这些缺点?

共有2个答案

莫宁
2023-03-14

如前所述,解决问题的常见方法是使用bean持有参数。但这是另一种基于构建器方法的解决方案:

public interface BaseOperation<T> {
   public T execute();
}

public class AddOperation implements BaseOperation<Integer> {
   private int a, b;

   public void setA(int arg){
     a = arg ;
     return this;
   }

   public void setB(int arg){
     b = arg;
     return this;
   }

   @Override
   public Integer execute() {
     return a+b ;
   }
}

然后像这样使用它:

new AddOperation().setA(1).setB(2).execute();

您可以通过以下方式混合必需和可选参数:

public class MultipleAddOperation implements BaseOperation<Integer> {
  private int sum ;

  public MultipleAddOperation(int requiredInt){
    sum = requiredInt;
  }

  public void add(int optionalInt){
    sum += optionalInt ;
    return this;
  }

  @Override
  public Integer execute(){
    return sum;
  }
}

所以:

new MultipleAddOperation(5).add(1).add(2).execute();
祁烨
2023-03-14

可以使用包含以下参数的bean:

public interface BaseOperation<T, U> {
    T execute(U input);
}

public class GetUsersOperation implements BaseOperation<GetUsersResponse, UserInput> {

    @Override
    public GetUsersResponse execute(UserInput input) {
        Date date = input.getDate();
        return new GetUsersResponse(date);
    }

}

您的抽象类只有一个抽象方法:最好使用接口。您可以实现多个接口,而您只能扩展一个类。

 类似资料:
  • 本文向大家介绍C#变量类型作为参数和返回值,包括了C#变量类型作为参数和返回值的使用技巧和注意事项,需要的朋友参考一下 示例 如果协变量类型显示为输出,则包含类型为协变量。生产Ts的生产者就像生产Ts。 如果逆变类型显示为输出,则包含类型为逆变。产生Ts的消费者就像消费Ts。 如果协变类型作为输入出现,则包含类型是协变的。消费Ts的生产者就像消费Ts。 如果逆变类型显示为输入,则包含类型为协变。消

  • 这个问题与这个问题很接近,但有一个主要区别。 可能的要求: (1) 我想生成一个带有通用返回值的Java函数。 (2)输入参数列表总是相同的。( (3) 函数应知道预期的返回参数类型。 我的尝试: 因为没有生成的实例,所以它不起作用。尝试使用

  • 问题内容: 假设我有一个Helper类,如下所示: 并且是将被设置一次,在构造函数的变量。 不是,因此我可以使用来区分变量和参数。 另一方面,是。在涉及静态变量时,是否有任何方法可以将其与参数区分开? 问题答案: 尽管不建议通过构造函数设置静态变量的值,但可以使用。

  • 我的函数使用一组给定的输入参数(变量)调用Python函数,并返回包含函数输出的元组(变量,因为输出随调用的函数而变化)。 我正在使用C 11通过MinGW-w64编译器的g端口在视窗10机器上编译。我声明了这个模板变量函数(并调用它)如下: 但是,会引发此错误(为了可读性,缩短为):

  • 我为协变返回类型的继承创建了一个小示例。基本上有三种不同的类别: 主应用程序: BaseManager: 鸟经理: 当我重写方法以返回时,为什么我需要将类型转换为? 我使用过的重写方法在返回类型上会有所不同吗?作为参考。 编辑: 我有不同的子模型,它们都继承自。所有模型都允许存在一次。我尝试将这些模型添加到列表中,而不是对每个模型使用单例。使用,我想得到实际的模型。也许我得考虑太多了。

  • 局部变量 仅在代码块或函数中才可见的变量(参考函数章节的局部变量部分)。 环境变量 会影响用户及shell行为的变量。 一般情况下,每一个进程都有自己的“环境”(environment),也就是一组该进程可以访问到的变量。从这个意义上来说,shell表现出与其他进程一样的行为。 每当shell启动时,都会创建出与其环境对应的shell环境变量。改变或增加shell环境变量会使shell更新其自身的