有没有比传递参数更好的方法来确定方法的行为?

Is there a better way to determine a method's behaviour than by passing it parameters?

最小工作示例:

static void foo(boolean bar){
   some code A
   if(bar){
      some code B
   }
   else{
      some code C
   }
   some code D
}

这里我们使用参数 bar 来确定方法的行为,而不是实际用它的值做一些事情。结果我们冗余地检查了 bar 的值。调用 foo() 的方法知道 bar 的值,因为它实际上将它作为参数传递。一个简单的替代方案是:

static void foo1(){
   A;B;D;
}

static void foo2(){
A;C;D
}

结果是,我们有冗余代码。现在我们可以将 A 和 D 放入方法中,但是如果它们操纵多个变量怎么办? Java 没有包含多个 return 类型的方法。即使假设我们 可以 将它们放入方法中,我们仍然会有 foo1 看起来像 a();b();d()foo2 看起来像 a();c();d()。我目前对这个问题的解决方案是为 c(), b() 创建一个功能接口,然后将 foo 定义为

static void foo(BCinterface baz){ A; baz.do() ;D;}

问题是每次我想编写一个行为略有不同的方法时,我都必须为它们不同的方法定义一个接口。我知道在其他语言中有函数指针。有什么方法可以在 java 中实现类似的东西而不必每次都定义接口吗?或者是否有一些做法可以避免首先出现这些情况?

您解决重复调用的方法似乎过于复杂。
要在 processing/algorithm 的特定步骤提供不同的行为,您可以简单地使用依赖于抽象方法和多态性的 the template method pattern :

In software engineering, the template method pattern is a behavioral design pattern that defines the program skeleton of an algorithm in an operation, deferring some steps to subclasses.1 It lets one redefine certain steps of an algorithm without changing the algorithm's structure.[2]


当然,您必须删除所有这些不允许利用 OOP 功能的 static 修饰符。
boolean 参数也不再需要。

在基classFoo,foo()中定义依赖抽象方法的一般行为,让子class定义抽象方法实施。

public abstract class Foo{

    public abstract void specificBehavior();   

    public void foo(){
       a();
       specificBehavior();
       d();
    }

   public void a(){
      ...
   }

   public void d(){
      ...
   }

}

现在子class是:

public class  FooOne extends Foo {
  public void specificBehavior(){
      ...
  }
}

public class FooTwo extends Foo {
  public void specificBehavior(){
      ...
  }
}

事实上,我认为您的第一个代码片段是最好且最易读的解决方案。

bar是用来判断方法会做什么的,那又如何呢?为什么要尝试将此逻辑移动到 foo 的调用方?无关紧要。如果我试图读取 foo 的调用者,我是否需要知道 foo 是如何工作的(假设它的名字很好)?不,因为我只对 foo 的调用者发生的事情感兴趣。抽象是一件好事,而不是坏事。所以我的建议是,就这样吧。

如果真的要抽取逻辑,不需要每次都新建一个函数式接口。 java.util.function 包和 java.lang 包已经为您提供了一些功能接口。只需使用它们。例如,在您的特定情况下,BCInterface 可以替换为 Runnable