Java 避免过度使用方法重载

Java 避免过度使用方法重载,java,design-patterns,refactoring,overloading,Java,Design Patterns,Refactoring,Overloading,我遇到了一个Java实用程序类,它有四种处理数据的方法。所有方法都处理参数,然后将其写入同一文件,每个方法接受四组不同的输入: util::process(String data1) util::process(String data1, Object1 data2) util::process(String data1, String data3) util::process(String data1, Object2 data4) 我看到了代码的味道,因为每次引入新的数据组合时,都会添加新

我遇到了一个Java实用程序类,它有四种处理数据的方法。所有方法都处理参数,然后将其写入同一文件,每个方法接受四组不同的输入:

util::process(String data1)
util::process(String data1, Object1 data2)
util::process(String data1, String data3)
util::process(String data1, Object2 data4)
我看到了代码的味道,因为每次引入新的数据组合时,都会添加新的方法。方法重载感觉像是在掩盖设计或对象构造问题


有没有可能重构它并避免方法重载?怎么做?

我想它不会因为超载而发臭。如果这些不是重载,而是不同的方法,那么不管怎样,它都是代码味道。从您所写的内容来看,代码似乎没有遵循。如果您没有提供更多关于您试图用代码完成的任务的详细信息,我们将无法提出任何解决方案。

这是一个有趣的问题,因为没有足够的详细信息来确切说明。我确实相信这段代码会散发出一种气味,这是试图让程序看起来像面向对象编程的恶臭。有趣的是,该方法名为“process”,类型要么是字符串,要么是类对象的通用名称。处理过程是什么?我猜肯定不是控制器对象。在某些情况下,您希望拥有具有责任的对象。因此,让我们假设其基础是应用程序的概念(例如,工作应用程序)。您可能希望将方法进程拉入该类型,然后使用继承通过引入不同的应用程序类型来增强功能

另一种选择是引入责任链模式。我看到的问题是,你似乎在说,潜在链中只有两个链接。链式方法的优点是处理程序之间不必相互了解


第三种选择是让继任者实现一个接口。这类似于命令模式,那么实际的“处理”实际上只是一个触发器,每件事都对自己的行为负责。

我可以想出几个可能性来合理地解释这种过载:

  • 这些函数中只有一个真正起作用,而其他函数只是为了方便而提供的,它们在内部调用“worker”方法。甚至可能这些方法都不做任何工作,它们都调用一个内部(私有)方法来完成繁重的工作。我不认为这个模式有任何问题,我自己也使用它,没有复制
  • 可能是由于语法限制或设计决策,重载方法试图实现的目标在一般情况下是不可能实现的

  • 正如前面提到的,您没有提供关于这些方法试图实现什么的信息。您可能能够重构并消除这些方法的所有变体,但在我建议您是否应该这样做或如何做之前,您需要指定这些方法的用途以及它们之间的差异。“进程”这个名称并没有告诉我们太多关于它们的信息。

    给我们提供data1-4的类型信息。我们在这里谈论的是什么语言?不同的语言有不同的结构来处理这种情况。每个组合是否由相同的代码处理?代码是否因有多少个参数而有所不同?我看到一个函数接受一个参数,其他函数接受两个参数。更新了问题以包括语言(即Java)和参数类型。Erisco,我不清楚你在问什么。该实用程序类中的方法由项目中的许多其他类调用。根据上下文,这些类将调用实用程序类中的相应方法。这些类可能可以使用数据1到4,但实用类只需要处理其中的两个。我在上面的评论中添加了更多细节。你还需要更多吗?如果是,你需要什么?