Java 设计模式以替换具有多个参数的方法

Java 设计模式以替换具有多个参数的方法,java,design-patterns,builder,Java,Design Patterns,Builder,Java 1.6 我有一个有很多参数的方法。这不是一个构造函数,而是一个普通的方法 class A { public void m (int a, int b, boolean c, List<>...) { } } A类{ 公共void m(int a,int b,boolean c,List…{} } 如何将方法替换为更好的形式?据我所知,Builder设计模式是为承包商设计的 您对Builder的看法是正确的,这取决于这些参数是否是必需的 我个人会从带有许多参数的

Java 1.6

我有一个有很多参数的方法。这不是一个构造函数,而是一个普通的方法

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

如何将方法替换为更好的形式?据我所知,
Builder
设计模式是为承包商设计的

您对Builder的看法是正确的,这取决于这些参数是否是必需的

我个人会从带有许多参数的方法(以及构造函数或类)开始。我的意思是,这些参数相关吗,方法逻辑相关吗?这有什么意义吗


如果这些参数具有某种关系,则它们可以放入某种域实体。

如果参数的数量是动态的,则可以使用:

publicstaticvoidmain(最终字符串[]args){
方法(新的HashMap(){{
放置(“p1”,新对象());
放置(“p2”,新对象());
}});
}
私有静态无效方法(映射参数){
}

它有一些缺点,但仍然是可行的方法。小心,每个呼叫站点都有自己的匿名类。类型安全性也可能存在一些问题。可以使用枚举代替基于字符串的键。Map只是最常见的一种类型,而不是使用任何自定义类型的Map。在动态参数长度的情况下,DBI比varargs更有用。

如果您需要很多参数,则可能会出现问题

方法非静态->您可以将一些参数定义为字段


如果您真的需要这样做,可能最好创建类A.AMParameter(int A、int b、boolean c、List…),并将其传递到m(A.AMParameter),或者使用Map…

如果参数自然组合在一起,则可以用。如果不希望参数对象的构造函数中有一长串参数,可以使用生成器设计模式来构造它。另一种有点相关的技术是。

Builder模式用于逐步构造复杂对象,最后一步将返回该对象。构造对象的过程应该是通用的,以便可以使用它创建同一对象的不同表示


“将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示”

如果我面对一个参数过多的方法,我通常会执行以下步骤:

  • 我试图识别这些参数相关的实体,并检查是否可以使用重构

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

  • 如果所有这些参数都是独立的,并且我想增加参数的数量,那么我将使用另一种常见的解决方案——重构

    您有一组自然组合在一起的参数用对象替换它们。

    为了构建
    对象
    可以使用其他技术和模式(例如构建器、方法链接、流畅的界面)


  • (虽然令人沮丧的是,公认的答案谈到了使用builder模式作为方法,但没有解释如何)他很可能想引入一种新的类型来保存参数,并且该类型(实例)应该是“构建的”并作为单个参数传递给方法。我认为builder对于这种情况来说太过分了……是的,你是对的。但是解决方案是什么呢?根据逻辑将方法划分为更细粒度的方法,这也减少了方法中的参数数量,最后使用builder模式得到结果。这种方法有两个好处:1)参数的数量将减少2)程序变得更加模块化。生成器很棒,但需要大量代码。在只有一种方法的情况下,这种模式是多余的。应该有一个原因,比如Hibernate标准。@例如,您应该向Groovy开发人员报告您的问题。或任何其他基于JVM的脚本语言开发人员。他们会高兴起来的。JLS完全支持这种方法,因此它不是一种黑客行为。谢谢。一个有趣的建议。我没有动态参数,但任何帮助都是无效的appreciated@Mikhail这与除java之外的任何其他jvm语言无关。在java中,双大括号初始化是一种不太为人所知的语法技巧,它有严重的缺点、性能影响和零优势。
    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){
    
    }