Java 如何将参数传递给接口的一个实现者而不是其他实现者(不将其传递给构造函数)?

Java 如何将参数传递给接口的一个实现者而不是其他实现者(不将其传递给构造函数)?,java,design-patterns,interface,Java,Design Patterns,Interface,我正在处理的应用程序由配置文件和步骤组成。每个配置文件由多个步骤组成,共有4种步骤: 顺序:此步骤完成后,按顺序转到下一步 跳转:此步骤完成后,转到ID为的步骤 已评估:此步骤完成后,将根据特定方法的结果确定下一个步骤ID 终端:此步骤是最后一步 我的步骤接口有一个名为公共抽象步骤getNextStep()的抽象方法。每个步骤类型根据需要实现此方法 问题是EvaluatedStep需要一个参数,我们称之为参数p,而其他步骤类型都不需要任何参数 我通过将接口中的方法头更改为公共抽象步骤getN

我正在处理的应用程序由配置文件和步骤组成。每个配置文件由多个步骤组成,共有4种步骤:

  • 顺序:此步骤完成后,按顺序转到下一步
  • 跳转:此步骤完成后,转到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…
。否则,您可以用任何东西调用它,比如
字符串
整数
矩形
。。。它不知道该怎么处理的各种各样的东西。