陷阱 - 丟擲懸掛的懸掛和其他問題
最新版本的 Oracle Java 樣式指南要求 if
語句中的 then
和 else
語句應始終包含在大括號或大括號中。類似的規則適用於各種迴圈語句的主體。
if (a) { // <- open brace
doSomething();
doSomeMore();
} // <- close brace
Java 語言語法實際上並不需要這樣做。實際上,如果 if
陳述的當時部分是單一陳述,則省略括號是合法的
if (a)
doSomething();
甚至
if (a) doSomething();
但是,忽略 Java 樣式規則並省略括號存在危險。具體而言,你會顯著增加帶有錯誤縮排的程式碼被誤讀的風險。
****晃來晃去的問題:
考慮上面的示例程式碼,重寫沒有大括號。
if (a)
doSomething();
doSomeMore();
這段程式碼似乎說,當 a
和 true
發生時, doSomething
和 doSomeMore
的呼叫都會發生。實際上,程式碼拼寫錯誤。doSomeMore()
呼叫的 Java 語言規範是在 if
語句之後的單獨語句。正確的縮排如下:
if (a)
doSomething();
doSomeMore();
****懸空的問題
當我們將 else
新增到混音中時會出現第二個問題。請考慮以下帶有大括號的示例。
if (a)
if (b)
doX();
else if (c)
doY();
else
doZ();
上面的程式碼似乎說當 a
是 false
時會呼叫 doZ
。實際上,縮排再次不正確。程式碼的正確縮排是:
if (a)
if (b)
doX();
else if (c)
doY();
else
doZ();
如果程式碼是根據 Java 樣式規則編寫的,它實際上看起來像這樣:
if (a) {
if (b) {
doX();
} else if (c) {
doY();
} else {
doZ();
}
}
為了說明為什麼更好,假設你不小心錯誤地縮排了程式碼。你最終會得到這樣的東西:
if (a) { if (a) {
if (b) { if (b) {
doX(); doX();
} else if (c) { } else if (c) {
doY(); doY();
} else { } else {
doZ(); doZ();
} }
} }
但在這兩種情況下,錯誤縮排的程式碼對於經驗豐富的 Java 程式設計師來說都看起來不對。