在我们的一些公司项目代码中,我经常阅读这样的内容:
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
因此,在不了解这一点的情况下,我猜更多的陈述意味着更多的时间来执行所以它不仅错误,而且从长远来看也更慢。
答案 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中引入)将它从布尔对象更改为布尔基元,虽然我无法想象它会有任何速度差。
一般来说,如果你假设一个变量的特定初始值,那么我建议初始化它而不是仅仅声明它,因为它使代码更具可读性。