重构-除了一个函数调用之外,方法共享相同的代码



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*/
    }
    /* ... */
}

当然,我会直接添加一些switch("要调用哪个方法")语句。但是有更好的方法吗?

您可以将方法作为参数传递给调用。让我们假设要调用的方法具有以下签名:

private void m() {...}

你可以写:

private void foo(Runnable methodToRun) {
    //...
    methodToRun.run();
    //...
}

你的各种foo方法会像:

private void foo1() { foo(new Runnable() { public void run() { someMethod(); } }); }

使用Java8,您还可以传递lambda或方法引用。

正如assylias所说,您可以在Java 8中使用方法引用。

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;
}

最新更新