2012-12-12 43 views
1

我在我的下面几行代码:我应该用两个if语句分开吗?

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

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

所以根据该说,我需要我的代码重写:

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

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

+1

“有人”需要阅读Java的短路逻辑运算符。 – GriffeyDog

回答

14

不,这是不正确的。他们称之为short circuit,如果第一个条件评估为false,则第二个条件根本不会被评估。

+0

它编译到相同的字节码吗?换句话说,最有效的方法是什么? –

+2

使用AND运算符。因为你可以更容易地阅读代码。这来自WikiPedia:“这两种情况之间计算效率的差异在很大程度上取决于使用的编译器和优化方案;通过适当的优化,它们将以相同的速度执行,因为它们将被编译为相同的机器代码”:http: //en.wikipedia.org/wiki/Short-circuit_evaluation –

7

那么,因为&&是一个short-circuit运营商。所以if这两个语句实际上是相同的。

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

1

它们是相同的。对于第一个示例,如果第一个表达式为false,则任何现代运行时都将忽略第二个表达式。

+2

Java语言规范要求短路行为。它不是由运行时决定的。 –

+1

那么,运行时就是规范的实现,对吧?所以我们都是对的。 :) –

+0

不,因为你符合'任何现代'。任何日期的任何Java实现都必须按照规定行事。行为实际上来自编译器,而不是JVM。 – EJP

0

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

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

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

它涉及的是风格和可读性问题。国际海事组织当你开始在一个单一的if声明中链接太多时,它可能很难阅读。

1

短路是更好的,这是由& &如果你检查空值的情况下,然后在该对象上应用功能,短路操作工作正常。如果条件1为假,它将从条件2停止执行。

例如:

String s=null;

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

,这并不抛出异常,并在大多数情况下,你救一个更多,如果检查。

0

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

+0

其实它不是。懒惰评估不会在Java中出现。 &&运算符的执行完全由语言规范定义,并且与懒惰评估无关。 – EJP

+0

其实我回复短路后,我的意思是评估内部的if语句条件是懒惰评估,因为部分不是必要的条件不评估。我没有讲清楚&&的确切定义。 – rduga

+0

@ruga实际上,“懒惰评估”也有一个非常确切的定义,正如您引用的文章中所提供的,并且它不会在Java中出现。 – EJP

0

这不是一个真正的问题,但请注意,如果你希望两个,如果评估的,你可以使用&:

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

,而不是

boolean a = methodA(); 
boolean b = methodB(); 
if (a && b) { 
    // 
} 
-1

是的,他们的建议是完全正确的。我建议你写的第一个检查为:

"sort".equals(command) 

也许它在这种情况下,但在未来没有意义。首先使用静态类型,所以你永远不需要空检查

+0

这个建议是完全错误的*他们和你需要阅读Java语言规范。 – EJP

+0

是啊......他们我的意思是其他评论:-) – boskop

2

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

我想说明的是,当多个if语句嵌套在一起时,代码的可读性会受到负面影响,而这对我来说是不嵌套的主要原因。例如:

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

比更清洁:

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

试想一下,有20嵌套的if语句?不是很普遍,当然,但可能。