关于java:多个else如果条件,以其他“else if”或“else”结束,当逻辑指示最后一个“else”-part只指示一种可能性?

Multiple else if conditions, end with an other “else if” or “else” when logic dictates the last “else”-part dictates only one possibility?

有时,由于您的ifelse if中条件背后的逻辑,您可以忽略最后的条件检查,而将其写为else。这样你就少做一次检查,不过阅读起来就不那么清晰了。什么是好的编码?因为检查少了一次,或者编译器针对这些情况进行了优化,所以它的效率会更高吗?

1
2
3
4
5
6
7
if(x<0){
  //statements
}else if(x==0){
  //statements
}else if(x>0){
  //statements
}

或与其他

1
2
3
4
5
6
7
if(x<0){
  //statements
}else if(x==0){
  //statements
}else{
  //statements
}


在爪哇中,如果在最后一个else if中包含条件,则存在一个潜在问题:

1
2
3
4
5
6
7
8
9
10
11
12
String whatIsX;
if (x < 0) {
   // statements
   whatIsX ="x is negative";
} else if (x == 0) {
   // statements
   whatIsX ="x is zero";
} else if (x > 0) {
   // statements
   whatIsX ="x is positive";
}
System.out.println(whatIsX);

这会给你一个错误。原因是编译器认为,如果if条件都不正确,则可能没有初始化whatIsX。我们知道这是不可能的,因为其中一个if条件必须是真的(假设x不能在错误的时间被另一个线程改变!)但是语言规则并不要求编译器尝试进行某种分析来解决这个问题。

因此,最好不要包括最后一个条件。将最后一个else if (x > 0)改为简单的else将使程序合法化。

这是Java的一个特性,因为它具有"明确的赋值"规则。该代码在大多数其他语言中都可以正常工作。


在您的情况下,您已经定义了,可以不考虑它,因为只有3种可能性。那就是

1
x==0 or x<0 or x>0

考虑到一个场景,当最后一个漏洞被打开时,它会为一个漏洞大喊大叫,因为如果所有的if&else if都失败了,它将进入最后一个else,因为它没有界限。


最后一种方法是正确的,因为如果它不是= 0< 0,那么它必须是> 0,并且没有遗漏其他可能性。

另一方面,您也可以考虑使用switch语句

1
2
3
4
5
6
7
8
9
10
11
12
13
    int x = 3;
    switch(x) {
       case 1:  x < 0;
               //something;
                 break;
        case 2:  x == 0;
                 //something;  
                 break;
        case 3:  x > 0;
                 //something;
                 break;
        default: break;
    }

在您的案例中,将最后一个if进行比较是不理想的,就像前2个if语句不正确一样,那么第三个if语句必须是正确的。所以只保留其他的就可以了。

不过,三元运算符是我个人的选择。

1
(x>0) ? //statements : (x==0) ? //statements : //statements

基本上是读

1
2
3
if( x>0) then statements
else if(x==0) then statements
else statements

关于三元运算符或if语句的更多信息


比那还要糟。有些语言甚至不允许空块。在bash中,在某些情况下,可以对空语句使用冒号(":")。在python中,你可以说"通过"。

这里,我们甚至不考虑一个一语句块的强制包围问题。

我认为代码的清晰性非常重要,编译器在优化条件方面非常聪明。

如果有人能证明一个额外的测试总是失败的,并且它是在每秒执行十亿次的代码中,那么…也许那时。

否则,如果一定要漏掉其他的,你可能会对可能会添加其他"elseifs"的效果发表评论。