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

标签 java function-pointers strategy-pattern

最小工作示例:

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 没有具有多种返回类型的方法。即使假设我们可以将它们放入方法中,我们仍然会有 foo1 看起来像 a();b();d(),并且foo2 看起来像 a();c();d()。我目前对这个问题的解决方案是为 c(), b() 创建一个功能接口(interface),然后将 foo 定义为

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

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

最佳答案

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

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

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

关于java - 有没有比传递参数更好的方法来确定方法的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48355569/

相关文章:

java - 找不到java.exe

c++ - 为什么相应成员不能正确访问成员函数指针?

c++存储指向未知类的成员函数的指针

c++ - CRTP 的运行时多态性设计和策略

c# - 遵循 O/C 原则在类层次结构的中间添加一个方法

java - 使用 Selenium 处理 InnerFrame

java - 定义类名 Money

java - Java 中的通用 protobuf 反序列化器

c++ - C++中不带virtual的多态实现多级继承

c++ - 使用 C++ 模板切换策略/算法