使用许多可选参数有效地重载函数

Function overloading efficiently with many optional arguments

今天我正在编写一个具有两个必需参数和三个可选参数的函数。由于使用 Optional<> 类型作为参数不受欢迎,函数重载一直是我处理这个问题的工具。所以我最终得到这样的结果:

public boolean func(int a, String b)

public boolean func(int a, String b, String c)

public boolean func(int a, String b, int d)

public boolean func(int a, String b, long e)

然后我必须对两个参数进行各种组合...

public boolean func(int a, String b, String c, int d)

public boolean func(int a, String b, String c, long e)

public boolean func(int a, String b, int d, long e)

最后 "full function"

public boolean func(int a, String b, String c, int d, long e)

这对我来说似乎工作量太大,当发生这种情况时,我觉得自己做错了什么。在这种情况下,为什么我应该创建 7 个附加函数而不是使用 Optional 或 POJO?处理此问题的最有效方法是什么?

您绝对不必实现可选参数的所有组合。

在对此做出决定时要牢记的关键观点是它对调用者的用处。如果您没有用例来支持和公开重载方法,那么创建这些重载方法只会添加不必要的代码,从而产生不必要的测试和维护负担。

如果您正在寻找一种更简单的方法来展现相同的灵活性,那么您可以使用 Optional:

public boolean func(int a, String b, 
   Optional<String> c, Optional<Integer> d, Optional<Long> e)

这可能是一个很好的折衷方案,允许您的合约在功能上等同于具有许多重载方法的初始 API。它允许您的客户选择他们发送的内容,并允许您消除 API 混乱。最重要的是,它明确了什么是可选的,调用者无需阅读每个方法的文档。