【问题标题】:Function overloading efficiently with many optional arguments使用许多可选参数有效地重载函数
【发布时间】:2018-05-05 15:57:31
【问题描述】:

今天我正在编写一个具有两个必需参数和三个可选参数的函数。由于不赞成使用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)

最后是“完整功能”

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

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

【问题讨论】:

  • 为什么你不能把它变成public boolean func(int a, String b, Object... args) 并检查里面的类型
  • 你可能想使用这篇文章中提到的可变参数方法:stackoverflow.com/questions/965690/…

标签: java overloading optional-parameters


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我认为 Optionals 仅适用于在流中使用的返回类型? java 的人似乎坚持不使用这种模式,这就是我没有使用的原因。
  • @rec 现在这是 API 开发人员的选择。可以理解的是,不鼓励使用 Optional 作为方法参数,但这种理由并不是绝对的。作为开发人员,您将评估哪个更好:可空的盒装原语、大量的方法重载、Optionals、基于范围的合同(例如 c &lt; 0,忽略它)?每个选项都有其缺点。 但我相信最大的收获将来自消除不必要的重载选项并仅实现 API 真正需要的少数选项
猜你喜欢
  • 2021-05-14
  • 1970-01-01
  • 2013-05-23
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多