7

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

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 

“假”变体去了:

0: iconst_1 
1: istore_1 

因此,在对此没有太多了解的情况下,我猜想更多的语句意味着更多的执行时间,所以从长远来看,这不仅是错误的,而且速度也会变慢。

4

5 回答 5

12
boolean foo = Boolean.FALSE;

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

Boolean.FALSE是一个java.lang.Boolean自动拆箱的对象;编译器基本上将其转换为:

boolean foo = Boolean.FALSE.booleanValue();

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

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

于 2012-10-18T12:47:05.923 回答
3

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

于 2012-10-18T12:44:17.327 回答
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。

如果您的项目符合这些风格准则,那可能证明您的可疑代码行是合理的。

于 2012-10-18T12:44:36.270 回答
2

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

同时,您通常可以(如果不是总是)安排您的代码,这样您就永远不会声明一个您没有最终值的变量,即,使您的对象不可变,这使它们更容易考虑。x的值是多少?相比于调用 foo() 和 bar() 之间的 x 值是多少?第一个通常更容易回答。这需要您按照您可能不习惯的方式来划分课程,但我建议您至少尝试一下。

于 2012-10-18T12:46:21.057 回答
1

尽管第一种方法不适用于 1.4 或更早版本的 JVM,但实际上并没有什么区别。第一个更复杂,因为它从布尔对象中获取静态值,然后依靠自动装箱(在 1.5 中引入)将其从布尔对象更改为布尔原语)虽然我无法想象它会做出任何速度区别。

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

于 2012-10-18T12:37:43.517 回答