天天看點

[改善Java代碼]别讓null值和空值威脅到變長方法

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

1 public class Client {  
 2     public void methodA(String str,Integer... is){       
 3     }  
 4      
 5     public void methodA(String str,String... strs){          
 6     }  
 7      
 8     public static void main(String[] args) {  
 9           Client client = new Client();  
10           client.methodA("China", 0);  
11           client.methodA("China", "People");  
12           client.methodA("China");  
13           client.methodA("China",null);  
14     }  
15 }      

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

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

KISS原則(Keep It Simple, Stupid,即懶人原則),按照此規則設計的方法應該很容易調用,可是現在在遵循規範的情況下,程式竟然出錯了,這對設計者和開發者而言都是應該嚴禁出 現的。

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

1 public static void main(String[] args) {  
2      Client client = new Client();  
3      String[] strs = null;  
4      client.methodA("China",strs);  
5 }      

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

作者:SummerChill

繼續閱讀