天天看點

程式設計點滴-關于boolean常量在判斷中的位置

今天review某同學的代碼時發現這樣一個情況:

debug是一個boolean的常量,原來是

後來因為要求在安全模式下不準列印log,于是改成這樣:

現在又增加了一種新的模式警用模式,于是改成這樣:

這樣會造成一點性能和空間損失的。

如果編譯器發現if(false)或者if(false && ...)這樣的語句,直接就不會編譯進位元組碼中,這是由短路規則所決定的。

而如果把debug放在最後,由于不符合短路規則,後面的語句也是沒必要編譯進來的,但是要保證前面的判斷是要執行的。

于是就生成了這樣一句話

白白要做兩次判斷!

下面看看完整的代碼。

源代碼:

反編譯之後是這樣的:

從反編譯的代碼中可以看到,不管是system.out.println("debug1");還是system.out.println("debug2");皆是虛妄,根本就直接被編譯器過濾掉了。

但是有短路規則的if(debug && !ts.issecmode() && !ts.ispolicemode()),連一點痕迹都沒留下來,而沒有短路規則的第二條判斷,就不得不留下if ((!ts.issecmode()) && (!ts.ispolicemode()));

繼續閱讀