2014-10-29 78 views
0

我有類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*/ 
    } 

    /* ... */ 

} 

當然,我會添加某種開關(「調用哪個方法」)語句。但有沒有更好的方法來做到這一點?

回答

1

您可以傳遞該方法作爲參數調用。讓我們假設方法來調用具有以下特徵:

private void m() {...} 

你可以寫:

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

和您的各種foo的方法是這樣的:

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

與Java 8你也可以傳遞一個lambda或一個方法引用。

+0

這正是我一直在尋找。非常感謝你! – BluesSolo 2014-10-29 15:00:25

0

正如assylias說,你可以使用Method References與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; 
} 
+0

使用Java 8更方便。感謝您的回答 – BluesSolo 2014-10-29 15:34:41

相關問題