如何在java中使用params来推广可调用的?

时间:2015-03-30 21:48:52

标签: java refactoring runnable callable

我有这两种方法

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()是无参数的。

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分: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();

}