在if或if中使用OR运算符if?

时间:2014-12-04 10:20:40

标签: java

早上好/下午/晚上,

我正在写一个简单的函数,如果作为参数给出的字符串(在这种情况下是一个双字符代码)匹配,它将返回一个布尔值。

我想知道哪种方式会被认为是“最佳”方式,它会使用多少||如下所示的单个运算符:

private boolean isCodeSpecial(String code){
    if( code.equalsIgnoreCase("AA") ||
        code.equalsIgnoreCase("AB") ||
        code.equalsIgnoreCase("SS") ||
        code.equalsIgnoreCase("DD") ||
        code.equalsIgnoreCase("YY") ||
        code.equalsIgnoreCase("ZZ") ||
        code.equalsIgnoreCase("AX") ){
        return true;
    }
    return false;
}

或者使用一系列其他if语句,如下所示:

private boolean isCodeSpecial(String code){
    if(code.equalsIgnoreCase("AA")){
        return true;
    }else if(code.equalsIgnoreCase("AB")){
        return true;
    }else if(code.equalsIgnoreCase("SS")){
    return true;
    }else if(code.equalsIgnoreCase("DD")){
        return true;
    }else if(code.equalsIgnoreCase("YY")){
        return true;
    }else if(code.equalsIgnoreCase("ZZ")){
        return true;
    }else if(code.equalsIgnoreCase("AX")){
        return true;
    }else{
        return false;
    }
}

我并不是真的关心这个应用程序的性能,因为我知道任何收益/处罚都可能很小并且几乎不可察觉 - 但是如果可能的话我想知道什么通常被认为是最佳实践以供将来参考。我想这个论点可能会说明这正是其他的问题吗?

提前致谢,

编辑:忘了提到我使用的是Java 1.6(所以我不相信在没有使用Enums的情况下可以进行简单的切换?)

7 个答案:

答案 0 :(得分:9)

为什么要使用if语句?

return code.equalsIgnoreCase("AA") ||
    code.equalsIgnoreCase("AB") ||
    code.equalsIgnoreCase("SS") ||
    code.equalsIgnoreCase("DD") ||
    code.equalsIgnoreCase("YY") ||
    code.equalsIgnoreCase("ZZ") ||
    code.equalsIgnoreCase("AX");

如果确实想要if语句,那么我绝对会采用第一种方法。由于短路,它将执行与if / else / if / else代码完全相同的比较次数 - 如果||运算符的第一个操作数求值为true,则第二个操作数赢得&#39 ;被评估......但它很多更清楚。

另一种选择是创建一个固定的不区分大小写的集合,然后你可以说:

return VALID_CODES.contains(code);

你可以用TreeSet

来做到这一点
private static final Set<String> VALID_CODES =
    new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);

static {
    VALID_CODES.add("AA");
    VALID_CODES.add("AB");
    VALID_CODES.add("SS");
    VALID_CODES.add("DD");
    VALID_CODES.add("YY");
    VALID_CODES.add("ZZ");
    VALID_CODES.add("AX");
}

答案 1 :(得分:1)

第一种情况是要走的路,从可读性和维护的角度来看,代码越小越好

事实上,如果你只是想要返回布尔值,那么Jon建议是最好的,因为它涉及的代码更少

答案 2 :(得分:1)

在你的情况下我会使用正则表达式:

return code.toUpperCase().matches( "(AA|AB|SS|DD|ZZ|XX|CC)" );

答案 3 :(得分:0)

一个包含所有这些字符串的数组和一个在第一次真实发生时返回的循环将更加可维护(并且更简洁)。

答案 4 :(得分:0)

如果我们使用开关盒,有什么可能?这会更好吗?

答案 5 :(得分:0)

考虑到最佳和最差情景,你的选择都同样有效,因为在两种情况下都需要执行相同数量的比较...但是,正如jon所回答的那样,第一个将比第二个更难读。一个...

如果你也尝试切换机箱......那将会有性能优势...

答案 6 :(得分:0)

我会选择第一种方式,因为它比第二种方式更清晰,更容易阅读,并且易于维护并完成相同的操作。

此外,您可以尝试更好的性能并且更易于阅读 - 切换

以上是同样的事情:

private static boolean isCodeSpecial(String code){
    switch(code.toUpperCase()){ //Convert code to upper case so that
        case "AA":              //you don't have to do case sensitive search
        case "AB":
        case "SS":
        case "DD":
        case "YY":
        case "ZZ":
        case "AX":
            return true;
    }
return false;
}

附加说明:

  

您只能在 JDK 7或更高版本 字符串的java中使用Switch。如果您使用的是早期版本,那么转到if else version