我在Test类中有几个方法,除了一个特定的方法调用之外,它们具有相同的代码。有没有可能将这些方法合并在一起(下面写入函数foo)并调用foo并告诉它在不执行更大的开关或if / else语句的情况下调用哪个方法?一个重要的注意事项是foo仅从类Test中调用(因此foo是私有的),函数foo本身从一个类Bar调用不同的方法。 Class Bar和Test不在同一继承树中。
class Test {
/* ... */
private void foo("Parameter that specifies which method to call from class Bar")
{
/* merged code which was equal */
Bar bar = new Bar();
bar.whichMethod(); // Call the method (from Class Bar) specified in the Parameter
/* merged code which was equal*/
}
/* ... */
}
当然可以直接向我添加某种开关("哪种方法可以调用")语句。但是有更好的方法吗?
答案 0 :(得分:2)
您可以将该方法作为参数传递。我们假设要调用的方法具有以下签名:
private void m() {...}
你可以写:
private void foo(Runnable methodToRun) {
//...
methodToRun.run();
//...
}
你的各种foo方法就像:
private void foo1() { foo(new Runnable() { public void run() { someMethod(); } }); }
使用Java 8,您还可以传递lambda或方法引用。
答案 1 :(得分:1)
正如assylias所说,你可以在Java 8中使用Method References。
public void testAdds() {
doTest(this::addOne);
doTest(this::addTwo);
}
private void doTest(Function<Integer,Integer> func) {
System.out.println("Func(41) returns " + func.apply(41));
}
public int addOne(int num) {
return num + 1;
}
public int addTwo(int num) {
return num + 2;
}