2015-03-30 40 views
0

我有這兩種方法如何在java中推廣帶參數的可調用函數?

private void saveBaseLineLatency(E2EResultShort e2EResultShort) { 
    LatencyHistogram latencyHistogram = getLatencyHistogram(e2EResultShort); 
    latencyDrillDownRepository.saveBaseLine(latencyHistogram); 
    saveLatencyTable(latencyHistogram); 
} 

private void saveFreshTestLatency(E2EResultShort e2EResultShort) { 
    System.out.println("log: before saveLatencyHistogram"); 
    LatencyHistogram latencyHistogram = getLatencyHistogram(e2EResultShort); 
    latencyDrillDownRepository.save(latencyHistogram); 
    saveLatencyTable(latencyHistogram); 
} 

我如何重構了他們共同的代碼?

我以爲使用Callable,但其call()是無參數的。

+0

你就不能使用一個輔助方法? – 2015-03-30 22:03:43

回答

0

Consumer是你想要的接口。它是Java 8中新的java.util.function軟件包的一部分,因此如果您使用的是較早版本的Java,則這不起作用。 (包也有一些類似的其它接口,如BiConsumer有兩個參數和接口用於消費的各種基本類型爲好。)

所以,你的助手方法是這樣的:

private void doLatencyOperation (E2EResultShort newThing, Consumer<LatencyHistogram> consumer) { 
    LatencyHistogram lh = getLatencyHistogram(newThing); 
    consumer.accept(lh); 
    saveLatencyTable(lh); 
} 

,你可以把它正是如此

private void saveBaseLineLatency(E2EResultShort e2EResultShort) { 
    doLatencyOperation(e2EResultShort, (lh) -> latencyDrillDownRepository.saveBaseLine(lh)); 
} 
0

創建一個抽象類,並把所有的公共代碼出現。

public abstract class MyClass{

public MyClass(E2EResultShort result, latencyDrillDownRepository){ 
    this.result = result; 
} 

public void execute() {

LatencyHistogram latencyHistogram = getLatencyHistogram(e2EResultShort); 
callMe(latencyHistogram, latencyDrillDownRepository); 
saveLatencyTable(latencyHistogram); 

}

public abstract void callMe(LatencyHistogram latencyHistogram, latencyDrillDownRepository); }`

現在,在你的方法,建立具體的MyClass的:

private void saveFreshTestLatency(E2EResultShort e2EResultShort) {

System.out.println("log: before saveLatencyHistogram"); 
MyClass myClass = new MyClass(e2EResultShort, latencyDrillDownRepository){ 
    public void callMe(LatencyHistogram latencyHistogram, latencyDrillDownRepository){ 
     latencyDrillDownRepository.save(latencyHistogram); 
    } 
} 

myClass.execute(); 

}