讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議5:別讓null值和空值威脅到變長方法 >

建議5:別讓null值和空值威脅到變長方法

上一建議講解了變長參數的重載問題,本建議還會繼續討論變長參數的重載問題。上一建議的例子是變長參數的範圍覆蓋了非變長參數的範圍,這次我們從兩個都是變長參數的方法說起,代碼如下:


public class Client{

public void methodA(String str, Integer……is){

}

public void methodA(String str, String……strs){

}

public static void main(Stringargs){

Client client=new Client();

client.methodA("China",0);

client.methodA("China","People");

client.methodA("China");

client.methodA("China",null);

}

}


兩個methodA都進行了重載,現在的問題是:上面的代碼編譯通不過,問題出在什麼地方?看似很簡單哦。

有兩處編譯通不過:client.methodA("China")和client.methodA("China",null),估計你已經猜到了,兩處的提示是相同的:方法模糊不清,編譯器不知道調用哪一個方法,但這兩處代碼反映的代碼味道可是不同的。

對於methodA("China")方法,根據實參"China"(String類型),兩個方法都符合形參格式,編譯器不知道該調用哪個方法,於是報錯。我們來思考這個問題:Client類是一個複雜的商業邏輯,提供了兩個重載方法,從其他模塊調用(系統內本地調用或系統外遠程調用)時,調用者根據變長參數的規範調用,傳入變長參數的實參數量可以是N個(N>=0),那當然可以寫成client.methodA("china")方法啊!完全符合規範,但是這卻讓編譯器和調用者都很鬱悶,程序符合規則卻不能運行,如此問題,誰之責任呢?是Client類的設計者,他違反了KISS原則(Keep It Simple, Stupid,即懶人原則),按照此規則設計的方法應該很容易調用,可是現在在遵循規範的情況下,程序竟然出錯了,這對設計者和開發者而言都是應該嚴禁出現的。

對於client.methodA("china",null)方法,直接量null是沒有類型的,雖然兩個methodA方法都符合調用請求,但不知道調用哪一個,於是報錯了。我們來體會一下它的壞味道:除了不符合上面的懶人原則外,這裡還有一個非常不好的編碼習慣,即調用者隱藏了實參類型,這是非常危險的,不僅僅調用者需要「猜測」該調用哪個方法,而且被調用者也可能產生內部邏輯混亂的情況。對於本例來說應該做如下修改:


public static void main(Stringargs){

Client client=new Client();

Stringstrs=null;

client.methodA("China",strs);

}


也就是說讓編譯器知道這個null值是String類型的,編譯即可順利通過,也就減少了錯誤的發生。