将许多参数传递给方法的最佳实践?

有时,我们必须编写接收许多许多参数的方法,例如:

public void doSomething(Object objA , Object objectB ,Date date1 ,Date date2 ,String str1 ,String str2 )
{
}

当我遇到这类问题时,我经常将参数封装到地图中。

Map<Object,Object> params = new HashMap<Object,Object>();
params.put("objA",ObjA) ;

......

public void doSomething(Map<Object,Object> params)
{
 // extracting params 
 Object objA = (Object)params.get("objA");
 ......
 }

这不是一个好的做法,将参数封装到地图中完全是浪费效率。好消息是,干净的签名,易于添加其他参数,修改最少。对于此类问题,最佳做法是什么?


答案 1

Effective Java 第 7 章(方法)第 40 项(仔细设计方法签名)中,布洛赫写道:

有三种技术可以缩短过长的参数列表:

  • 将方法分解为多个方法,每个方法只需要一个参数子集
  • 创建帮助器类以保存参数组(通常是静态成员类)
  • 使生成器模式从对象构造调整为方法调用。

关于更多细节,我鼓励你买这本书,这真的是值得的。


答案 2

使用带有神奇字符串键的地图是一个坏主意。你失去了任何编译时检查,并且真的不清楚所需的参数是什么。你需要写非常完整的文档来弥补它。几周后,你会在不看代码的情况下记住这些字符串是什么吗?如果你打错了什么?使用错误的类型?在运行代码之前,您不会发现答案。

请改用模型。创建一个类,该类将成为所有这些参数的容器。这样就可以保持Java的类型安全。您还可以将该对象传递给其他方法,将其放入集合中等。

当然,如果这组参数没有在其他地方使用或传递,那么专用模型可能有些过分。需要取得平衡,所以要使用常识。


推荐