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