建議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 |