Java 条件允许时的替代书写方式

Java 条件允许时的替代书写方式,java,coding-style,Java,Coding Style,我想知道如果条件允许,有没有其他的或者优雅的写作方式 还有更多的情况需要检查 例如 if(cond1){ if(cond2){ if(cond3){ if(cond4){ //all conditions are checked flag = true; } } } } 是的,您可以使用逻辑AND运算符 if(cond1 && cond2 &&

我想知道如果条件允许,有没有其他的或者优雅的写作方式

还有更多的情况需要检查

例如

if(cond1){
   if(cond2){
      if(cond3){
         if(cond4){
            //all conditions are checked
             flag = true;
         }
      }
   }
}

是的,您可以使用逻辑AND运算符

if(cond1 && cond2 && cond3 && cond4) {
    flag = true;
}
如果
cond1
为false,则不计算其余条件,依此类推

在这种情况下,直接赋值可能更简单(受Patrick原始答案的启发):


一种简短易读、优雅的方式是:

 flag = cond1 && cond2 && cond3 && cond4 ? true : false;
或者正如普斯坦顿所说:

 boolean flag = cond1 && cond2 && cond3 && cond4;

如果少就是多,这是最优雅的:

boolean flag = cond1 && cond2 && cond3 && cond4;

正如ZongLi所指出的,很容易将其简化为一组AND,但当您有复杂的逻辑时,这会变得更加复杂

if(cond1){
   if(cond2){
      if(cond3){
         if(cond4){
            //all conditions are checked
             flag = true;
         }
      }
      if(cond4){
         flag3 = true;
      }
   }
   else
      flag2 = true;
}
现在的情况是,减少这一点并不是那么简单

flag1 = cond1 && cond2 && cond3 && cond4
flag2 = cond1 && cond2 && cond4
flag2 = cond1 && !cond2
但是,如果将它们简化为布尔表达式,通常会降低可读性和可维护性,因为它会丢失变量之间的语义关系。上面的例子可以改写为

if(cond1){
   if(cond2){
      if(cond4){
         flag3 = true;
         if(cond3){
             flag = true;
         }
      }
   }
   else
      flag2 = true;
}

这将取决于代码的语义,这是最好的,但大量嵌套表明,最好使用布尔表达式或重构条件树


在这里记住布尔逻辑等价是很有用的,特别是
如果x那么y
在逻辑上等价于
!X或Y

您甚至可以删除括号。您甚至可以删除“?”?真:假;'我只想补充一点,那就是短路评估
false&&anything
短路评估为
false
,而不评估
anything
true | |任何
短路评估为
true
。此外,只有布尔运算符(
&&
|
)使用此求值。二进制
&
没有使用它。@Pshemo布尔和|也没有。你的术语有点混乱。计算短路与否的是运算符本身:它与布尔值或二进制值无关。@EJP您是对的。我忘了当
&
|
用于布尔变量时,它们就不是二进制运算符。很难在凌晨4点集中注意力并写出好的评论:/
if(cond1){
   if(cond2){
      if(cond4){
         flag3 = true;
         if(cond3){
             flag = true;
         }
      }
   }
   else
      flag2 = true;
}
if(cond1 && cond2){

      if(cond4){
         flag3 = true;
         if(cond3){
             flag = true;
         }
      }
}
else if(cond1){ flag2 = true; }