[英]Initialization of a boolean with a Boolean.FALSE/.TRUE - why?
在我們的一些公司項目代碼中,我經常閱讀以下內容:
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
因此,在不太了解這一點的情況下,我猜更多的語句意味着更多的時間來執行所以它不僅錯誤而且從長遠來看也更慢。
boolean foo = Boolean.FALSE;
這是一個奇怪且不必要的復雜代碼,由可能不太了解Java的人編寫。 你不應該編寫這樣的代碼,PMD和FindBugs是正確的。
Boolean.FALSE
是一個java.lang.Boolean
對象,可以自動取消裝箱; 編譯器實際上將其轉換為:
boolean foo = Boolean.FALSE.booleanValue();
我根本不需要在Java中初始化變量......
成員變量不需要顯式初始化; 如果不這樣做,它們將使用默認值初始化(在boolean
的情況下為false
)。 局部變量確實需要顯式初始化; 如果您嘗試使用局部變量而不初始化它,編譯器將給您一個錯誤。
兩者都是一樣的。 但是boolean foo = false;
足夠。
事實上,使用自動取消裝箱的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。
如果您的項目符合這些樣式指南,那么可以證明您的可疑代碼行。
沒有充分的理由這樣做,它可能只是一個新手Java程序員。 我不會太擔心,只需用假替換它。
同時,通常如果不總是安排你的代碼,你永遠不會聲明一個你沒有最終值的變量,即使你的對象不可變,這使得它們更容易思考。 x的價值是多少? 比較foo()和bar()調用之間的x值是多少? 第一個通常更容易回答。 這要求你沿着你可能不習慣的行分開你的類,但我建議你至少嘗試一下。
雖然第一種方法不適用於1.4或更早版本的JVM,但確實沒有區別。 第一個是更復雜的,因為它從布爾對象獲取靜態值,然后依靠自動裝箱(在1.5中引入)將它從布爾對象更改為布爾基元,雖然我無法想象它會有任何速度區別。
一般來說,如果你假設一個變量的特定初始值,那么我建議初始化它而不是僅僅聲明它,因為它使代碼更具可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.