1

好的,我正在构建程序来检查许多领域。如果至少 1 个字段不正确,那么我不希望我的程序花时间检查其他字段。那么让我们看看这段代码:

 // Util.isReadyToUse method return true if the string is ready for using, & return false if it is not.

boolean isOK=true;

if(!Util.isReadyToUse(firstName)){
   isOK=false;
}
else if(isOK && !Util.isReadyToUse(lastName)){
   isOK=false;
}
else if(isOK && !Util.isReadyToUse(email)){
   isOK=false;
}
.....more checking
if(isOK) {
   //do sthing
}

好的,运行时,程序会先检查!Util.isReadyToUse(firstName). 假设它返回(isOK=false)。接下来程序将检查isOK && !Util.isReadyToUse(lastName).

所以我的问题是,既然isOK目前是假的,那么程序会花时间检查!Util.isReadyToUse(lastName)之后的条件&&吗?

好吧,作为一个人,如果你看到isOK=false 了,现在你看到了isOK && !Util.isReadyToUse(email),那么你不想浪费时间看,!Util.isReadyToUse(email)因为 isOK=false 并且你看到了&&after isOK

机器也会这样工作吗?

我正在考虑使用break,但为什么人们说break在 if 语句中不起作用:

if(!Util.isReadyToUse(firstName)){
   isOK=false;
   break;
}
else if(isOK && !Util.isReadyToUse(lastName)){
   isOK=false;
   break;
}......

在这种情况下最好的解决方案是什么?

4

6 回答 6

7

所以我的问题是,既然 isOK 目前是假的,那么程序会在 && 之后花时间检查条件!Util.isReadyToUse(lastName) 吗?

Java 很聪明,如果你有条件if(somethingFlase && something),那么由于Short-circuit 评估something将无法达到。由于整个表达式将与第二个条件无关,因此 Java 无需对其进行评估。false

15.23 开始。条件与运算符 &&

如果结果值为 false,则条件与表达式的值为 false,并且不计算右侧操作数表达式。如果左侧操作数的值为真,则计算右侧表达式。

  • if(a && b)- 如果afalseb将不会被检查。
  • if(a && b)- 如果atrue,b将被检查,因为如果是false,则表达式将为false
  • if(a || b)- 如果atrueb则不会被检查,因为true无论如何都是这样。
  • if(a || b)- if ais false,b将被检查,因为 if bis truethen itll be true
于 2013-10-31T15:09:46.067 回答
2

不,它缩短了谓词的其余部分。

那就是你会看到类似的东西

if(A != null && A.SomeVal == someOtherVal)
于 2013-10-31T15:09:58.097 回答
1

Java 支持所谓的短路评估。请参阅此页面:

http://en.wikipedia.org/wiki/Short-circuit_evaluation

这意味着如果您的语句中的第一个布尔值足以满足该语句,那么其余的值将被跳过。如果我们有以下情况:

boolean a = false;
boolean b = true;

if(a && b) /*Do something*/;

'b' 永远不会被检查,因为 'a' 的错误值足以打破 if 语句。

话虽如此,您的程序永远不会利用这一点,因为唯一isOK设置为 false 的时间是在您的一个else if语句中。

于 2013-10-31T15:13:12.653 回答
1

正如其他响应者提到的那样,Java 会做聪明的事情。

但可能是您希望 Java 继续检查,在这种情况下,您可以使用 & vs && 或 | 与 ||。

if (someMethod() | anotherMethod() {

如果第一个方法返回 true,Java 仍将执行第二个方法。

if (someMethod() & anotherMethod() {

如果第一种方法为假,Java 仍将执行第二种方法。

于 2013-10-31T15:13:16.350 回答
1

不,Java 不会为此“浪费时间”。这称为短路评估

这种机制通常用于例如空值检查:

if (foo != null && foo.neverFailsWithNPE()) {
    // ...
}
于 2013-10-31T15:13:36.523 回答
0

您不需要在 if..else if.. else 语句上使用 break,因为一旦它找到一个为真的条件,其余的甚至都不会被查看。

于 2013-10-31T15:11:46.913 回答