Java逻辑与IF

时间:2011-02-26 11:56:38

标签: java logic

我想执行4'if'语句,如果它可以这样说;我想在事情发生之前检查四个值。我已经把:

if (a==1 && b==2 && c==3 && d==4) {
 foo;
}

将这样的逻辑AND堆叠为首选方法还是四个单独的IF语句,一个在另一个首选内?逻辑ANDs方法对我来说似乎更有效但是它们不应该像这样堆叠的原因/时间/地点?或者它总是首选的方法?

8 个答案:

答案 0 :(得分:5)

语义

if (a == 1 && b == 2 && c == 3 && d == 4) {
    foo;
}

完全等同于

if (a == 1)
    if (b == 2)
        if (c == 3)
            if (d == 4)
                foo;

您选择看起来最具可读性的那个。 (请注意,如果您有许多链式条件,如果选择后一种选项,缩进级别将会非常糟糕。)


分开它的唯一原因是你需要单独的else子句:

if (a == 1) {
    if (b == 2) {
        ....
    } else {
        // a == 1, but b != 2
    }
} else {
    // a != 1
}

答案 1 :(得分:3)

如果且仅当所有四个条件都为真时才需要采取行动,那么这正是写作的方式。

答案 2 :(得分:3)

更具可读性和可理解性。

以下代码

if(A)
    if(B)
        do something;
// no else

可能比if(A & B)更容易理解,具体取决于问题。

答案 3 :(得分:3)

最可读的方式是首选方式。在这个特定的抽象示例中,if肯定更具可读性。下面是一个示例,当首选使用多个if s:

if (someObject != null) {
  if (someObject.getType() == SomeClass.SomeType) {
    // do something
  }
  // maybe more code working with someObject here, much later
}

不仅你可以看到这些检查明显是分开的(并且你没有弄乱检查的顺序),但是也可以在内部之后添加更多代码到someObject做一些事情。马上。

至于效率,不仅你不应该考虑它,直到你遇到性能问题,并且分析表明这正是问题的根源,但在两种情况下它肯定都是相同的。编译器可能会将两种形式优化为相同的代码。

答案 4 :(得分:2)

也许你可以将这些条件包含在一个布尔值中,以便if条件的紧凑性

boolean condition = (a==1 && b==2 && c==3 && d==4);

if(condition)
{
    foo;
}

答案 5 :(得分:1)

conditional-and operator (&&)“仅在其左侧操作数的值为true时才计算其右侧操作数。”如果提前知道truefalse的概率,则更改谓词的顺序可能会有一些优势。

答案 6 :(得分:1)

在您的示例中,最佳解决方案就是您所做的。嵌套了很多if s代码味道。不关心速度肯定是一样的,JIT会关注这种微不足道的优化。关心可读性。

在其他事情相同的情况下,较短的表达式是更好的可读性。

答案 7 :(得分:0)

这一切都取决于具体情况。将它们全部堆叠在一个条件中会为您提供所需的结果,但如果要在循环或任何其他执行非常多的代码块中进行测试,则可能效率低下。将这样的条件分割成子条件(多个if语句)是好的,如果这将要执行很多并且具有所需值的a,b,c和d的概率不相等。或者,如果某些条件比其他条件更昂贵(可能是某种函数调用。

例如,如果a不等于1的概率非常大,那么这样说是合理的:

if(a == 1)
   if(...)

编译器不知道特定呼叫的概率或昂贵程度,因此您需要决定优化条件是否重要。 例如,如果您正在执行某种启发式搜索,这是达到目标的条件,那么对您的条件进行分区可以为您提供相当不错的性能提升。

如果您确定不会经常使用这部分代码,那么肯定会选择一个条件,因为代码可读性远比几纳秒重要。