最小工作示例:
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/