过载问题:
- 方法重载(如 CollectionClassifier 程序的示例)可能会导致意外行为,因为要根据参数类型选择要调用的方法是在编译时发生的,而不是在运行时发生的。
过载与覆盖:
- 重载是在编译时选择方法,而重写是在运行时根据类型选择正确的方法,这使得行为更加可预测。
避免混乱的开销:
- 当不清楚将为一组参数调用哪个方法时,重载会让程序员感到困惑。这在公共 API 中尤其成问题。
推荐:
- 避免导出具有相同数量参数的两个重载。
- 以不同的方式命名方法而不是重载(如 writeInt 和 writeBoolean)。
- 使用可变参数时,避免重载。
泛型和自动装箱案例:
- Java 中泛型和自动装箱的引入导致了重载问题,如 List.remove 的示例所示,由于存在多个重载,它的行为可能会令人困惑。
函数式接口和 lambda:
- Java 8 中添加的 lambda 通过重载采用函数式接口的方法而增加了混乱的风险,特别是当这些接口不是“根本不同”时。
实用解决方案:
- 使用instanceof进行显式测试可以避免与重载相关的问题。
- 使用完全不同的参数(无法相互转换的类型)进行重载可以避免混淆。
- 构造函数和重载:虽然构造函数总是重载,但使用静态工厂可以避免这种复杂性。
合理的例外:
- 在某些情况下,例如改编旧类,可能需要重载,但必须谨慎使用,确保使用相同参数调用时重载方法的行为相同。
结论:
- 应谨慎使用重载。虽然技术上可行,但通常最好以不同的方式命名方法或避免混淆重载,以确保代码更清晰、更可预测。
书中的示例:
以上是项目 明智地使用超载的详细内容。更多信息请关注PHP中文网其他相关文章!