2013-10-16 68 views
0

我有一個方法,我寫在下面。它使用了大量的instanceof邏輯,但至少我沒有4種相同方法的重載版本。下面的方法會出什麼問題?爲什麼重載方法比使用instanceof更受歡迎?爲什麼重載方法推薦使用java方法中的instanceof運算符?

public static <T extends Number> Number SumVector(List<? extends Number> vector){ 

     if (vector.get(0) instanceof Integer){ 
      Integer retVal = 0; 
      for (Number val : vector){ 
       retVal = retVal+ ((Integer) val).intValue(); 
      } 
      return retVal; 
     } 

     if (vector.get(0) instanceof Double){ 
      Double retVal = (double) 0; 
      for (Number val : vector){ 
       retVal = retVal+ ((Double) val).doubleValue(); 
      } 
      return retVal; 
     } 

     if (vector.get(0) instanceof Float){ 
      Float retVal = (float) 0.0; 
      for (Number val : vector){ 
       retVal = retVal+ ((Float) val).floatValue(); 
      } 
      return retVal; 
     } 

     return null; 
    } 
+2

有一個在軟件設計中的重要模式稱爲[高內聚(HTTP ://en.wikipedia.org/wiki/Cohesion_(computer_science))。你提出的代碼不具有很高的凝聚力。 –

+2

「至少我沒有4種相同方法的重載版本。」我不知道你爲什麼認爲這是一個優勢。您仍然有相同代碼的四個版本。他們只是在一個單一的方法。這不是一個優點,如果你使用了方法重載,運行時'instanceof'測試可以由編譯器完成。 – EJP

+0

@EJP:我不知道編譯器會將我的重載方法轉換爲instanceof檢查。你能否再詳述一下你的評論?謝謝 –

回答

0

建築上,我建議你讓你的類抽象並創建處理具體案例的特定子類。這樣可以讓你既跳過手動檢查類型,又可以輕鬆添加新的操作。

請記住,在做檢查手動你的情況完全正常的,因爲不期望數子類別數是改變...

+0

在這種情況下,你能詳細說明接口和具體類的使用嗎? –

+0

我會創建一個接口(f.e.'NumberVector extends List '),它定義了需要由子類實現的具體方法(f.e'T sum()');然後創建具體的子類(f.e.'IntVector extends ArrayList implements NumberVector ','FloatVector'等)。請記住,這預示着你正在控制所有這些向量生成的位置...... –

0

就個人而言,我覺得它使代碼更具可讀性,如果你有多個重載函數(在你的情況爲每個號碼類型)。但是你所做的是完全有效的。它真的取決於你。想想誰將會使用這個功能,是否只是你,在這種情況下做你想做的事情,因爲你知道將要進入的數據,或者它將成爲圖書館的一部分,在這種情況下你可能只想要允許某些東西輸入。在你的例子中,它不應該因爲你說

<T extends Number> 

所以它不會採取任何不是一個數字。但是,標準只是爲了便於閱讀而使用多種功能。希望很清楚!

相關問題