代码之家  ›  专栏  ›  技术社区  ›  cxandru

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

  •  2
  • cxandru  · 技术社区  · 7 年前

    最小工作示例:

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

    在这里,我们使用参数栏来确定方法的行为,而不是实际使用其值。因此,我们冗余地检查 bar . 调用 foo() 知道 的价值 酒吧 ,因为它实际上是作为参数传递的。一个简单的替代方案是:

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

    结果是,我们有冗余代码。现在我们可以将A和D放入方法中,但如果它们操纵多个变量呢?Java没有具有多个返回类型的方法。即使假设我们 能够 把它们变成方法,我们仍然会 foo1 看起来像 a();b();d() foo2 看起来像 a();c();d() . 我目前对此问题的解决方案是为 c(), b() ,然后将foo定义为

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

    问题是,每当我想编写一个行为略有不同的方法时,我都必须为不同的方法定义一个接口。我知道在其他语言中也有函数指针。有没有什么方法可以在java中实现类似的功能,而不必每次都定义一个接口?或者,是否有一些实践可以避免在第一时间出现这种情况?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Sweeper    7 年前

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

    bar 用于确定该方法将执行的操作,那么是什么呢?为什么要尝试将此逻辑移动到 foo ? 没有意义。如果我想读懂 foo公司 ,我需要知道怎么做吗 foo公司 工作(因为它的名字很好)?不,因为我只关心 foo公司 . 抽象是 好的 事情,不是坏事。所以我的建议是,就这样吧。

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

        2
  •  0
  •   davidxxx    7 年前

    您解决重复调用的方法似乎过于复杂。
    要在处理/算法的特定步骤中提供独特的行为,只需使用 the template method pattern 这取决于抽象方法和多态性:

    在软件工程中,模板方法模式是一种行为 定义 操作,将某些步骤推迟到子类。 1 它让人重新定义 在不改变算法的 结构[2]


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

    在基类中定义 Foo , foo() 它定义了依赖于抽象方法的一般行为,并让子类定义抽象方法实现。

    public abstract class Foo{
    
        public abstract void specificBehavior();   
    
        public void foo(){
           a();
           specificBehavior();
           d();
        }
    
       public void a(){
          ...
       }
    
       public void d(){
          ...
       }
    
    }
    

    现在子类:

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