使用Boolean.FALSE / .TRUE初始化布尔值 - 为什么?

时间:2012-10-18 12:33:56

标签: java boolean

在我们的一些公司项目代码中,我经常阅读这样的内容:

boolean foo = Boolean.FALSE;

除了事实上AFAIK我只需要在Java中初始化局部变量(没有像Pascal那样的随机值),而且除了特别是对于布尔我常常想要初始化的事实,我在这里想念什么?为什么不:

boolean foo = false;

我不明白。 PMD和Findbugs等代码分析工具也标志着它。但为什么呢?

编辑: 在没有真正了解字节码的情况下,除了它在那里我创建了一个示例类并对其进行反编译。 Boolean.FALSE转到:

0: getstatic #15 // Field java/lang/Boolean.FALSE:Ljava/lang/Boolean; 
3: invokevirtual #21 // Method java/lang/Boolean.booleanValue:()Z 
6: istore_1 

'false'变体转到:

0: iconst_1 
1: istore_1 

因此,在不了解这一点的情况下,我猜更多的陈述意味着更多的时间来执行所以它不仅错误,而且从长远来看也更慢。

5 个答案:

答案 0 :(得分:11)

boolean foo = Boolean.FALSE;

这是一个奇怪且不必要的复杂代码,由可能不太了解Java的人编写。你不应该编写这样的代码,PMD和FindBugs是正确的。

Boolean.FALSE是一个java.lang.Boolean对象,可以自动取消装箱;编译器基本上将其转换为:

boolean foo = Boolean.FALSE.booleanValue();
  

我根本不需要在Java中初始化变量......

成员变量不需要显式初始化;如果不这样做,它们将使用默认值进行初始化(在false的情况下为boolean)。局部变量确实需要显式初始化;如果你尝试使用局部变量而不初始化它,编译器会给你一个错误。

答案 1 :(得分:2)

两者都是一样的。但是boolean foo = false;已经足够了。

答案 2 :(得分:2)

使用自动取消装箱的Boolean常量的样式实际上与许多Java项目特有的整体过度性很好地相关。例如:

public boolean isItOrIsItNotTheValueWeExpect(String aStringParameterThatCouldBeNull) {
  boolean booleanReturnValue = Boolean.FALSE;
  if (aStringParameterThatCouldBeNull != null) {
    if (aStringParameterThatCouldBeNull.length() > 3) {
      booleanReturnValue = Boolean.TRUE;
    }
    else {
      booleanReturnValue = Boolean.FALSE;
    }
  }
  else if (aStringParameterThatCouldBeNull == null) {
    booleanReturnValue = Boolean.TRUE.booleanValue();
  }
  return booleanReturnValue;
}

显然,上面的代码比这个难以理解的混乱更受欢迎:

public boolean validate(String s) {
  return s == null? true : s.length() > 3;
}

三元运算符的出现被认为是违规行为,有些项目甚至将其标记为CheckStyle。

如果您的项目符合这些风格指南,那么可以证明您可疑的代码行。

答案 3 :(得分:2)

没有充分的理由这样做,它可能只是一个新手Java程序员。我不会太担心,只需将其替换为假。

同时,通常情况下,如果不总是安排你的代码,你永远不会声明一个你没有最终值的变量,即使你的对象不可变,这使得它们更容易思考。 x的价值是多少?比较foo()和bar()调用之间的x值是多少?第一个通常更容易回答。这需要你沿着你可能不习惯的行分开你的课程,但我建议你至少尝试一下。

答案 4 :(得分:1)

虽然第一种方法不适用于1.4或更早版本的JVM,但确实没有区别。第一个是更复杂的,因为它从布尔对象获取静态值,然后依靠自动装箱(在1.5中引入)将它从布尔对象更改为布尔基元,虽然我无法想象它会有任何速度差。

一般来说,如果你假设一个变量的特定初始值,那么我建议初始化它而不是仅仅声明它,因为它使代码更具可读性。