Java - 如何循环使用相同名称但不同参数的方法

时间:2015-06-12 15:02:27

标签: java

我有一个名为:ComplexValidator的类,它扩展了absract类Validator,它有两个方法:

Validate(Part part);
getAnswer():

我也有验证器,我们将它们命名为A,B,C和D.

所以

AValidator extends Validator
BValidator extends Validator
CValidator extends Validator
DValidator extends Validator

我不在我的代码前面,所以我不会使用伪代码。

CValidator采用与其余部分不同的参数,AB和D使用part来获取文件名等,但CValidator使用numberOfFiles(在loop (for part p: multipart)中增加,因此在每次循环重复后,numberoffiles会增加,所以我可以比较它与maxNumberOfFiles字段)。

可悲的是,我不知道如何创建抽象类,将任何参数带到方法,所以所有方法必须采用Part部分。 Cvalidator不使用它,我必须使字段numberOfFiles静态,所以我可以访问它。

有没有办法让这些验证器不带参数但不使用静态? 有没有办法让抽象类成为子类能够改变它所采用的参数的方式? 如果它需要其他参数,我可以在以下情况下将其全部循环:

List <Validator> validators = new ArrayList<>();

在我的ComplexValidator中。

然后我将所有子验证器添加到它并循环遍历它们:

for (Validator v: validators){
validate(part);
}

2 个答案:

答案 0 :(得分:3)

overriden方法的参数类型必须与原始方法相同。

为了解决您的问题,我将创建一个自定义类,它包含您可能希望传递给validate函数的所有不同参数。

像这样的东西

class Wrapper{
  Part param1;
  File param2;
  File param3;
}

class Validator{
  void validate (Wrapper wrapper);
}


class ValidatorA extends Validate{
 void validate (Wrapper wrapper){
    //use wrapper.part... 
 }
}

class ValidatorC extends Validate{
 void validate (Wrapper wrapper){
    //use wrapper.file... 
     }
}

答案 1 :(得分:1)

您可能想要使用java反射。使用Class,您可以getMethods并循环使用每种方法的方法和getParameterTypes,或者如果事先知道您希望的方法类型getMethod(没有s)并提供一个类型的数组。

在你的情况下,我将转到第一种方法,并根据第二个参数(文件数)的存在,invoke方法的好方法(需要所有参数)。