有时,我们必须编写接收许多参数的方法,例如:
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");
......
}
这不是一个好的做法,将参数封装到map中完全是浪费效率。好的是,干净的签名,很容易添加其他参数,只需最少的修改。解决这类问题的最佳实践是什么?
发布于 2010-03-12 20:01:42
使用带有神奇字符串键的map不是一个好主意。您会丢失任何编译时检查,并且不清楚所需的参数是什么。您需要编写非常完整的文档来弥补这一点。不看代码,几周后你能记住这些字符串是什么吗?如果你打错了怎么办?使用错误的类型?在运行代码之前,您不会发现。
相反,使用模型。创建一个类,它将成为所有这些参数的容器。这样就保证了Java的类型安全。您还可以将该对象传递给其他方法,将其放入集合中,等等。
当然,如果这组参数没有在其他地方使用或传递,那么专用模型可能会被夸大。有一个平衡需要达成,所以使用常识。
发布于 2010-03-14 03:51:36
如果您有许多可选参数,您可以创建fluent API:将单个方法替换为方法链
exportWithParams().datesBetween(date1,date2)
.format("xml")
.columns("id","name","phone")
.table("angry_robots")
.invoke();
使用静态导入,您可以创建内部流畅API:
... .datesBetween(from(date1).to(date2)) ...
发布于 2010-03-12 20:07:10
首先,我会尝试重构该方法。如果它使用了那么多参数,那么无论如何它都可能太长了。分解它既可以改进代码,又可以减少每个方法的参数数量。您还可以将整个操作重构为它自己的类。其次,我会寻找使用相同参数列表的相同(或超集)的其他实例。如果您有多个实例,则可能表示这些属性属于一起。在这种情况下,创建一个类来保存参数并使用它。最后,我将评估参数的数量是否值得创建一个map对象来提高代码的可读性。我认为这是一个个人电话--这种解决方案的每一种方式都有痛苦,折衷点可能有所不同。对于六个参数,我可能不会这么做。对于10个方法,我可能会这样做(如果没有其他方法先起作用的话)。
https://stackoverflow.com/questions/2432443
复制相似问题