Java 1.6
我有一个包含许多参数的方法。这不是构造函数,而是常规方法。
class A {
public void m (int a, int b, boolean c, List<>...) { }
}
如何将方法替换为更好的形式?据我所知,Builder
设计模式适用于构造函数。
答案 0 :(得分:3)
如果参数自然地在一起,则可以用Parameter Object代替。如果在参数对象的构造函数中不需要很长的参数列表,则可以使用Builder设计模式来构造它。另一个有点相关的技术是Preserve Whole Object。
答案 1 :(得分:3)
如果我面对的参数太多,我通常会执行以下步骤:
我尝试识别这些参数与之相关的实体,并检查是否可以使用Preserve Whole Object重构。
您将从对象获取多个值,并将这些值作为参数传递给方法调用。 改为发送整个对象。
如果所有这些参数都是独立的,并且我想增加参数数量,我会使用另一种常见解决方案 - Introduce Parameter Object重构。
你有一组自然结合在一起的参数。 用对象替换它们。
为了构建object
可以使用其他技术和模式(例如,Builder,Method chaining,Fluent接口)。
答案 2 :(得分:2)
你对Builder很正确,取决于这些参数是否是强制性的。
我个人会从http://en.wikipedia.org/wiki/Single_responsibility_principle开始,因为具有许多参数的方法(和构造函数或类)会闻起来。我的意思是,那些参数是相关的,是方法逻辑相关吗?它有意义吗?
如果这些参数有一些关系,它们可以适合某种域实体。
答案 3 :(得分:1)
如果参数数量是动态的,您可以使用double brace initialization:
public static void main(final String[] args) {
method(new HashMap<String, Object>(){{
put("p1", new Object());
put("p2", new Object());
}});
}
private static void method(Map<String, Object> params){
}
它有一些缺点,但仍然可行。小心每个呼叫站点都有自己的匿名类。类型安全也可能存在一些问题。您可以使用枚举代替基于字符串的键。而不是Map可以使用任何自定义类型,Map只是最常见的。在动态参数长度的情况下,DBI比varargs更有用。
答案 4 :(得分:1)
Builder模式用于逐步构造复杂对象,最后一步将返回对象。构造对象的过程应该是通用的,以便它可以用于创建同一对象的不同表示。
“将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示”
答案 5 :(得分:0)
如果你需要很多参数 - 有些不对劲......
方法不是静态的 - &gt;您可以将一些参数定义为字段。
如果您真的需要这样做,可能最好创建类A.AMParameter(int a,int b,boolean c,List&lt;&gt; ...),并将其传递给m(A.AMParameter),或者使用Map ...