Java编译器:优化"级联"ifs和最佳实践?

jen*_*ens 1 java optimization

Java编译器是否优化了这样的语句

if (a == true) {
 if (b == true) {
  if (c == true) {
   if(d == true) {
       //code to process stands here
   }
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

if (a == true && b==true && c==true && d == true)
Run Code Online (Sandbox Code Playgroud)

所以这是我的第一个问题:两者都采用完全相同的"CPU周期",或者是第一个"慢"的变体.

我的第二个问题是,第一个带有级联的变体,如果被认为是糟糕的编程风格,因为它是如此冗长?

(我喜欢第一个变体,因为我可以更好地逻辑分组我的表达式并更好地评论它们(我的if语句比示例中的更复杂),但也许这是糟糕的编程风格?)甚至更慢,这就是我要问的原因.. .

谢谢Jens

Mac*_*tka 16

首先不要使用a == TRUE:

 if (a) { ... }
Run Code Online (Sandbox Code Playgroud)

其次这样的代码:

public class Test {
  public int f(boolean a, boolean b, boolean c, boolean d) {
    if (a && b && c && d) {
      return 1;
    } else {
      return 2;
    }
  }

  public int g(boolean a, boolean b, boolean c, boolean d) {
    if (a)
      if (b)
        if (c)
          if (d)
            return 1;
    return 2;
  }
}
Run Code Online (Sandbox Code Playgroud)

编译成(javap -c Test):

public class Test extends java.lang.Object{
public Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public int f(boolean, boolean, boolean, boolean);
  Code:
   0:   iload_1
   1:   ifeq    19
   4:   iload_2
   5:   ifeq    19
   8:   iload_3
   9:   ifeq    19
   12:  iload   4
   14:  ifeq    19
   17:  iconst_1
   18:  ireturn
   19:  iconst_2
   20:  ireturn

public int g(boolean, boolean, boolean, boolean);
  Code:
   0:   iload_1
   1:   ifeq    19
   4:   iload_2
   5:   ifeq    19
   8:   iload_3
   9:   ifeq    19
   12:  iload   4
   14:  ifeq    19
   17:  iconst_1
   18:  ireturn
   19:  iconst_2
   20:  ireturn

}
Run Code Online (Sandbox Code Playgroud)

如您所见,字节码是相同的.

第三 - 它取决于问题,但通常它太冗长.如果您评论此类详细信息:

  • 你的评论太冗长了.Thay应该支持不复制它的代码(BAD :) x = x + 1; // Increase x by 1 - 可能汇编程序只是异常,因为add rax, 1 ; Increase x by 1rax是通知x.
  • 你的代码正在做一些它可能不应该做的"聪明"事情(但有些情况是合理的)

  • 可能不应该有x.读`if(finished)System.exit(0)`.大声用英语"如果完成退出".读`if(finished == true)System.exit(0)`."如果完成是真正的退出".通常使用1.长描述性名称和2.仅在条件下使用布尔值. (3认同)