1

我的代码中有以下几行:

    if (command.equals("sort") && args.length == 2) {
    //run some program
    }

有人建议我应该使用两个单独if的语句,因为如果命令不等于“排序”,则无需评估任何其他if语句,无论 args 长度是否正确。

因此,据此,我需要将代码重写为:

if (command.equals("sort")) {
  if (args.length == 2) {
    //run some program
  }
}

我知道他们都做这项工作,但我的问题是哪一个更好,更有效?

4

9 回答 9

14

不,那不是真的。他们称之为short circuit,如果第一个条件评估为假,则根本不会评估第二个条件。

于 2012-12-12T20:08:17.100 回答
7

好吧,既然&&short-circuit运营商。所以这两个if陈述实际上是相同的。

因此,在第一种情况下,如果您的command.equals("sort"), 返回 false,则根本不会评估以下条件。所以,在我看来,就选择第一个。更清楚了。

于 2012-12-12T20:08:22.123 回答
2

如前所述,短路将导致程序在条件失败时退出 if 语句,这意味着不会评估任何进一步的条件,因此两种格式的评估方式没有真正的区别。

我想指出,当您有多个相互嵌套的 if 语句时,代码的易读性会受到负面影响,而这对我来说是不嵌套的主要原因。例如:

if( conditionA && conditionaB && !conditionC ){
    // Do Something
}

比:

if( conditionA ){
    if( conditionB ){
        if( !conditionC ){
            // Do Something
        }
    }
}

想象一下,有 20 个嵌套的 if 语句?当然,这并不常见,但有可能。

于 2012-12-12T20:33:18.880 回答
1

他们是一样的。对于您的第一个示例,如果第一个表达式为假,任何现代运行时都将忽略第二个表达式。

于 2012-12-12T20:09:42.713 回答
1

短路更好,由 && 完成,如果您检查一个值的空大小写,然后在该对象上应用一个函数,短路运算符效果很好。如果条件 1 为假,则从条件 2 停止执行。

前任:

String s=null;

if(s!=null && s.length())

这不会引发异常,并且在大多数情况下,如果检查,您会再保存一个。

于 2012-12-12T20:16:32.980 回答
0

如果条件顺序相同,则它们在效率方面完全相同。

if (command.equals("sort") && args.length == 2)

如果 command.squals("sort") 返回 false 并且永远不会检查 args.length 将退出。这就是short-circuit运营商的&&操作。

它归结为样式和可读性问题。IMO 当您开始在单个语句中将太多链接在一起时if,可能会难以阅读。

于 2012-12-12T20:13:11.017 回答
0

实际上,它被称为 [Lazy_evaluation]:http ://en.wikipedia.org/wiki/Lazy_evaluation

于 2012-12-12T20:22:30.730 回答
0

这不是真正的问题,但请注意,如果您想要评估这两个,您可以使用 & :

if (methodA() & methodB()) {
    // 
}

代替

boolean a = methodA();
boolean b = methodB();
if (a && b) {
    //
}
于 2012-12-12T20:31:12.177 回答
-1

是的,他们的建议是完全正确的。我建议你将第一张支票写成:

"sort".equals(command)

也许在这种情况下没有意义,但在将来。首先使用静态类型,这样您之前就不需要空检查

于 2012-12-12T20:33:11.737 回答