首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将许多参数传递给方法的最佳实践?

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

Stack Overflow用户
提问于 2010-03-12 19:51:09
回答 11查看 109.4K关注 0票数 104

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

代码语言:javascript
复制
public void doSomething(Object objA , Object objectB ,Date date1 ,Date date2 ,String str1 ,String str2 )
{
}

当我遇到这类问题时,我通常会将参数封装到映射中。

代码语言:javascript
复制
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");
 ......
 }

这不是一个好的做法,将参数封装到map中完全是浪费效率。好的是,干净的签名,很容易添加其他参数,只需最少的修改。解决这类问题的最佳实践是什么?

EN

回答 11

Stack Overflow用户

发布于 2010-03-12 20:01:42

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

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

当然,如果这组参数没有在其他地方使用或传递,那么专用模型可能会被夸大。有一个平衡需要达成,所以使用常识。

票数 75
EN

Stack Overflow用户

发布于 2010-03-14 03:51:36

如果您有许多可选参数,您可以创建fluent API:将单个方法替换为方法链

代码语言:javascript
复制
exportWithParams().datesBetween(date1,date2)
                  .format("xml")
                  .columns("id","name","phone")
                  .table("angry_robots")
                  .invoke();

使用静态导入,您可以创建内部流畅API:

代码语言:javascript
复制
... .datesBetween(from(date1).to(date2)) ...
票数 25
EN

Stack Overflow用户

发布于 2010-03-12 20:07:10

首先,我会尝试重构该方法。如果它使用了那么多参数,那么无论如何它都可能太长了。分解它既可以改进代码,又可以减少每个方法的参数数量。您还可以将整个操作重构为它自己的类。其次,我会寻找使用相同参数列表的相同(或超集)的其他实例。如果您有多个实例,则可能表示这些属性属于一起。在这种情况下,创建一个类来保存参数并使用它。最后,我将评估参数的数量是否值得创建一个map对象来提高代码的可读性。我认为这是一个个人电话--这种解决方案的每一种方式都有痛苦,折衷点可能有所不同。对于六个参数,我可能不会这么做。对于10个方法,我可能会这样做(如果没有其他方法先起作用的话)。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2432443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档