Java 在if或just-else if中使用OR运算符?

Java 在if或just-else if中使用OR运算符?,java,Java,早上好/下午好/晚上好 我正在编写一个简单的函数,它将返回一个布尔值,如果在本例中作为参数提供的字符串与两个字符的代码匹配 我想知道哪种方法被认为是实现这一点的最佳方法,如果如下所示,是否在单个操作系统中使用多个| |运算符: private boolean isCodeSpecial(String code){ if( code.equalsIgnoreCase("AA") || code.equalsIgnoreCase("AB") || code.e

早上好/下午好/晚上好

我正在编写一个简单的函数,它将返回一个布尔值,如果在本例中作为参数提供的字符串与两个字符的代码匹配

我想知道哪种方法被认为是实现这一点的最佳方法,如果如下所示,是否在单个操作系统中使用多个| |运算符:

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;
}
或者使用一系列else-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;
    }
}
我并不真正关心此应用程序中的性能,因为我知道任何收益/损失都可能是最小的,几乎是不可见的-但如果可能的话,我想知道一般认为的最佳实践是什么,以供将来参考。我想可以提出这样一个论点,那就是这正是if的其他用途吗

提前感谢,

编辑:忘了提到我正在使用Java 1.6,所以我不认为不使用枚举就可以实现简单的切换?

为什么要使用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,则不会计算第二个操作数。。。但这要清楚得多

另一种选择是创建一个固定的不区分大小写的集合,这样您就可以说:

return VALID_CODES.contains(code);
您可以通过树集来实现这一点:


第一种情况是可行的,因为从可读性和维护的角度来看,代码越少越好


事实上,如果您只想返回布尔值,Jon建议是最好的,因为它涉及更少的代码。在您的情况下,我将使用regexp:

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

一个包含所有这些字符串的数组和一个在第一次真正出现时经过并返回的循环将更易于维护,也更不冗长。

如果我们使用switch case,有什么可能性?这会更好吗?

考虑到最好和最坏的情况,您的两种选择将同样有效,因为在这两种情况下,将执行相同数量的比较。。。但正如乔恩所回答的,第一个比第二个可读性差


如果你也尝试一下开关盒。。。我想这将有一个性能优势

我会选择第一种方式,因为它比第二种方式更清晰、更容易阅读,也更容易维护,而且做的事情完全一样

此外,您可以尝试一些性能更好、更易于阅读的东西-切换

以下是上述相同内容的外观:

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。如果您使用的是早期版本的java,那么请选择If-else版本


我将使静态块更短:有效的_代码.addallarray.asListAA,AB,SS,DD,YY,ZZ,AX@杰斯珀:那是一个选择,是的。老实说,TreeSet不接受构造函数中的集合和比较器是一件很遗憾的事情:我忘了提到,在本例中,我使用的是Java 1.6,我认为除非使用1.7+,否则不可能对字符串执行切换-我认为这可以用1.6个枚举来解决,但方法的值也可以
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;
}