重构if-else,如果是Java 8样式的链

时间:2014-10-30 08:23:06

标签: java java-8

我有一个带有以下if-else-if链的方法:

        if(downstreamActual.getNumber() <= downstreamRecommended.getNumber()){
            downstreamActual.setInvalid();
            showErrorWindow();
            throw new NumberFormatException();
        }else if(upstreamActual.getNumber() <= upstreamRecommended.getNumber()){
            upstreamActual.setInvalid();
            showErrorWindow();
            throw new NumberFormatException();
        }else if(biUpstreamActual.getNumber() <= biUpstreamRecommended.getNumber()){
            biUpstreamActual.setInvalid();
            showErrorWindow();
            throw new NumberFormatException();
        }else if(biDownstreamActual.getNumber() <= biDownstreamRecommended.getNumber()){
            biDownstreamActual.setInvalid();
            showErrorWindow();
            throw new NumberFormatException();
        }

我们每一步都做同样的工作(为布尔表达式中使用的第一个对象调用相同的方法,调用showErrorWindow()并抛出Exception

有哪些好的技巧,尤其是使用Java 8来使这些代码更易于管理?

4 个答案:

答案 0 :(得分:3)

根据您的评论,我认为您不需要Java 8构造。

只需使用方法:

 public void validate (NumberTextBox actual, NumberTextBox recommended) 
 {
     if(actual.getNumber() <= recommended.getNumber()) {
        actual.setInvalid();
        showErrorWindow();
        throw new NumberFormatException();
     }
 }

然后拨打4次电话:

 validate (downstreamActual,downstreamRecommended);
 validate (upstreamActual,upstreamRecommended);
 ...

由于第一个失败会引发异常,从而阻止对其余的进行测试,因此您不需要if else-if结构。

答案 1 :(得分:0)

我在这里看不到java 8的参与,但你可以做的一件事是以下列方式为if-else链创建一个方法:

public void handleStreams() throws NumberFormatException {
    if(downstreamActual.getNumber() <= downstreamRecommended.getNumber()) {
        setInvalid(downstreamActual);
    } else if(upstreamActual.getNumber() <= upstreamRecommended.getNumber()) {
        setInvalid(upstreamActual);
    } else if(biUpstreamActual.getNumber() <= biUpstreamRecommended.getNumber()) {
        setInvalid(biUpstreamActual);
    } else if(biDownstreamActual.getNumber() <= biDownstreamRecommended.getNumber()) {
        setInvalid(biDownstreamActual);
    } else {
        return;
    }

    showErrorWindow();
    throw new NumberFormatException();
}

public void setInvalid(MyObject stream) {
    stream.setInvalid();
}

答案 2 :(得分:0)

如果这些流有一个共同的超类,那么你可以直接在它们中实现它。换句话说,如果

public class DownstreamActual extends CustomStream {

然后您可以将recommendation作为变量添加到CustomStream

public int recommendedValue;

并在创建实例时设置它。然后您可以创建一个检查值

的方法
public void checkRecommendedValue() {
    if(this.getNumber() <= this.recommendedValue){
        this.setInvalid();
        showErrorWindow();
        throw new NumberFormatException();
    }
}

答案 3 :(得分:0)

使用java 8可以做的一件事是避免使用单独的方法(如果它调用你)并使用新语法在方法内创建一个方法:

BiConsumer<Thing, Thing> check = (actual, recommended) -> {
    if (actual.getNumber() <= recommended.getNumber()) {
        actual.setInvalid();
        showErrorWindow();
        throw new NumberFormatException();
    }
};

check.accept(downstreamActual, downstreamRecommended);
check.accept(upstreamActual, upstreamRecommended);
check.accept(biUpstreamActual, biUpstreamRecommended);
check.accept(biDownstreamActual, biDownstreamRecommended);