簡體   English   中英

重構 - 除了一個函數調用之外,方法共享相同的代碼

[英]Refactoring - Methods share the same code except for one function call

我在類Test中有幾個方法,除了一個特定的方法調用之外,它們具有相同的代碼。 是否有可能將這些方法合並在一起(下面顯示為函數foo)並調用foo並告訴它在不執行更大的開關或if / else語句的情況下調用哪個方法? 一個重要的注意事項是foo僅從類Test中調用(因此foo是私有的),函數foo本身從一個類Bar調用不同的方法。 類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*/
    }

    /* ... */

}

當然直接我會添加某種開關(“哪個方法來調用”)語句。 但是有更好的方法嗎?

您可以將該方法作為參數傳遞。 我們假設要調用的方法具有以下簽名:

private void m() {...}

你可以寫:

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

你的各種foo方法就像:

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

使用Java 8,您還可以傳遞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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM