讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議8:不要讓舊語法困擾你 >

建議8:不要讓舊語法困擾你

N多年前接手了一個除了源碼以外什麼都沒有的項目,沒需求、沒文檔、沒設計,原創者也已鳥獸散了,我們只能通過閱讀源碼來進行維護。期間,同事看到一段很「奇妙」的代碼,讓大家幫忙分析,代碼片段如下:


public class Client{

public static void main(Stringargs){

//數據定義及初始化

int fee=200;

//其他業務處理

saveDefault:save(fee);

//其他業務處理

}

static void saveDefault(){

}

static void save(int fee){

}

}


該代碼的業務含義是計算交易的手續費,最低手續費是2元,其業務邏輯大致看懂了,但是此代碼非常神奇,"saveDefault:save(fee)"這句代碼在此處出現後,後續就再也沒有與此有關的代碼了,這做何解釋呢?更神奇的是,編譯竟然還沒有錯,運行也很正常。Java中竟然有冒號操作符,一般情況下,它除了在唯一一個三元操作符中存在外就沒有其他地方可用了呀。當時連項目組裡的高手也是一愣一愣的,翻語法書,也沒有介紹冒號操作符的內容,而且,也不可能出現連括號都可以省掉的方法調用、方法級聯啊!這也太牛了吧!

隔壁做C項目的同事過來串門,看我們在討論這個問題,很驚奇地說「耶,Java中還有標號呀,我以為Java這麼高級的語言已經拋棄goto語句了……」,一語點醒夢中人:項目的原創者是C語言轉過來的開發人員,所以他把C語言的goto習慣也帶到項目中了,後來由於經過N手交接,重構了多次,到我們這裡goto語句已經被重構掉了,但是跳轉標號還保留著,估計上一屆的重構者也是稀里糊塗的,不敢貿然修改,所以把這個重任留給了我們。

goto語句中有著"double face"作用的關鍵字,它可以讓程序從多層的循環中跳出,不用一層一層地退出,類似高樓著火了,來不及一樓一樓的下,goto語句就可以讓你"biu~"的一聲從十層樓跳到地面上。這點確實很好,但同時也帶來了代碼結構混亂的問題,而且程序跳來跳去讓人看著就頭暈,還怎麼調試?!這樣做甚至會隱禍連連,比如標號前後對像構造或變量初始化,一旦跳到這個標號,程序就不可想像了,所以Java中拋棄了goto語法,但還是保留了該關鍵字,只是不進行語義處理而已,與此類似的還有const關鍵字。

Java中雖然沒有了goto關鍵字,但是擴展了break和continue關鍵字,它們的後面都可以加上標號做跳轉,完全實現了goto功能,同時也把goto的詬病帶了進來,所以我們在閱讀大牛的開源程序時,根本就看不到break或continue後跟標號的情況,甚至是break和continue都很少看到,這是提高代碼可讀性的一劑良藥,舊語法就讓它隨風而去吧!