Java 如何将参数传递给接口的一个实现者而不是其他实现者(不将其传递给构造函数)?
我正在处理的应用程序由配置文件和步骤组成。每个配置文件由多个步骤组成,共有4种步骤:Java 如何将参数传递给接口的一个实现者而不是其他实现者(不将其传递给构造函数)?,java,design-patterns,interface,Java,Design Patterns,Interface,我正在处理的应用程序由配置文件和步骤组成。每个配置文件由多个步骤组成,共有4种步骤: 顺序:此步骤完成后,按顺序转到下一步 跳转:此步骤完成后,转到ID为的步骤 已评估:此步骤完成后,将根据特定方法的结果确定下一个步骤ID 终端:此步骤是最后一步 我的步骤接口有一个名为公共抽象步骤getNextStep()的抽象方法。每个步骤类型根据需要实现此方法 问题是EvaluatedStep需要一个参数,我们称之为参数p,而其他步骤类型都不需要任何参数 我通过将接口中的方法头更改为公共抽象步骤getN
- 顺序:此步骤完成后,按顺序转到下一步
- 跳转:此步骤完成后,转到ID为的步骤
- 已评估:此步骤完成后,将根据特定方法的结果确定下一个步骤ID
- 终端:此步骤是最后一步
步骤
接口有一个名为公共抽象步骤getNextStep()
的抽象方法。每个步骤类型根据需要实现此方法
问题是EvaluatedStep需要一个参数,我们称之为参数p
,而其他步骤类型都不需要任何参数
我通过将接口中的方法头更改为公共抽象步骤getNextStep(参数p)来解决这个问题代码>但我知道这不是一个好的解决方案有什么更好的方法吗?
注:
- 我无法将
参数p
传递给EvaluationStep构造函数,因为该参数仅在需要调用getNextStep()
时可用
参数p
将来可能是不同参数的组合,因此该问题的解决方案必须灵活。换句话说,现在我只需要将参数p
传递给getNextStep()
,但将来我可能需要传递一系列不同的参数getNextStep(参数p,参数a,s)
如何避免这种情况
一种方法是在签名上使用varargs,如下所示:
pubic abstract Step getNextStep(Object... parameters)
然后可以通过以下任何一种方式调用:
seq.getNextStep();
eval.getNextStep(p);
future.getNextStep(p,a,s);
所有这些都将匹配接口。在实现内部,如果需要,可以将它们引用为数组成员:
public Step getNextStep(Object... parameters){
if ( parameters.length > 0 && parameters[0] instanceof Parameter ){
Parameter p = (Parameter) parameters[0];
}
}
您应该能够将参数使用者添加到抽象类:
abstract class Step {
public abstract Step getNextStep();
public void addParameter(Parameter p) {
}
public void addParameter(Argument a) {
}
public void addParameter(Something s) {
}
}
class Evaluated extends Step {
Parameter p;
@Override
public Step getNextStep() {
}
@Override
public void addParameter(Parameter p) {
this.p = p;
}
}
接口没有“abstract”关键字。你指的是抽象类还是接口?是的,它们指的是抽象类或接口,你不必显式地写出它。我不知道如何调用getNextStep()
。如果您有一个步骤
对象(即,您不知道它是什么类型),则必须传递参数或不传递参数-您如何知道该做什么?如果您知道您有一个EvaluatedStep
,则转换为EvaluatedStep
,您可以调用任何您想要的EvaluatedStep特定函数(如果需要,包括一个重载版本的getNextStep()
)
Step nextStep=currentStep.getNextStep(p)
。getNextStep()实现选择是否使用参数。为什么不让接口有两个相互重载的方法:一个带参数,一个不带参数。另外,为了克服Flexibility问题,您可以使用自定义对象作为参数,并根据需要简单地向其添加getter和setter,或者可以使用哈希表作为参数之类的解决方案。这非常聪明。这是如何改进的:我们声明了一个名为nextstepsolutionparameter
的新空接口,该接口由Parameter
、Argument
和Something
实现,然后在Step
接口中只需要一个额外的方法:addnextstepsolutionparameter(nextstepsolutionparameter p)
?@W.K.S-这将起到细化作用-我只添加了这三种方法,因为您的问题中有这三种类型。让它们都实现一个接口肯定会改进您的代码。最好定义一些StepParameter
接口,使参数
、参数
和某些东西都能扩展。然后可以将其声明为采用StepParameter…
而不是Object…
。否则,您可以用任何东西调用它,比如字符串
,整数
,矩形
。。。它不知道该怎么处理的各种各样的东西。