设计模式替换具有许多参数的方法

时间:2014-01-27 08:29:59

标签: java design-patterns builder

Java 1.6

我有一个包含许多参数的方法。这不是构造函数,而是常规方法。

 class A {
   public void m (int a, int b, boolean c, List<>...) { }
 }

如何将方法替换为更好的形式?据我所知,Builder设计模式适用于构造函数。

6 个答案:

答案 0 :(得分:3)

如果参数自然地在一起,则可以用Parameter Object代替。如果在参数对象的构造函数中不需要很长的参数列表,则可以使用Builder设计模式来构造它。另一个有点相关的技术是Preserve Whole Object

答案 1 :(得分:3)

如果我面对的参数太多,我通常会执行以下步骤:

  1. 我尝试识别这些参数与之相关的实体,并检查是否可以使用Preserve Whole Object重构。

      

    您将从对象获取多个值,并将这些值作为参数传递给方法调用。 改为发送整个对象。

  2. 如果所有这些参数都是独立的,并且我想增加参数数量,我会使用另一种常见解决方案 - 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 ...