過載問題:
- 方法重載(如 CollectionClassifier 程式的範例)可能會導致意外行為,因為要根據參數類型選擇要呼叫的方法是在編譯時發生的,而不是在執行時發生的。
過載與覆蓋:
- 重載是在編譯時選擇方法,而重寫是在運行時根據類型選擇正確的方法,這使得行為更加可預測。
避免混亂的開銷:
- 當不清楚將為一組參數呼叫哪個方法時,重載會讓程式設計師感到困惑。這在公共 API 中尤其成問題。
推薦:
- 避免匯出兩個具有相同數量參數的重載。
- 以不同的方式命名方法而不是重載(如 writeInt 和 writeBoolean)。
- 使用可變參數時,避免重載。
泛型與自動裝箱案例:
- Java 中泛型和自動裝箱的引入導致了重載問題,如 List.remove 的範例所示,由於存在多個重載,它的行為可能會令人困惑。
函數式介面與 lambda:
- Java 8 中新增的 lambda 透過重載採用函數式介面的方法而增加了混亂的風險,特別是當這些介面不是「根本不同」時。
實用解決方案:
- 使用instanceof進行明確測試可以避免與重載相關的問題。
- 使用完全不同的參數(無法相互轉換的類型)進行重載可以避免混淆。
- 建構函式與重載:雖然建構函式總是重載,但使用靜態工廠可以避免這種複雜性。
合理的例外:
- 在某些情況下,例如改編舊類,可能需要重載,但必須謹慎使用,確保使用相同參數呼叫時重載方法的行為相同。
結論:
- 應謹慎使用重載。雖然技術上可行,但通常最好以不同的方式命名方法或避免混淆重載,以確保程式碼更清晰、更可預測。
書中的範例:
以上是項目 明智地使用超載的詳細內容。更多資訊請關注PHP中文網其他相關文章!