【问题标题】:best way to pass many arguments to a method in Java将许多参数传递给Java中的方法的最佳方法
【发布时间】:2015-09-25 23:04:54
【问题描述】:

我有一个方法

makeSomeObject(String a,String b,KeyValue...){}

//method call
Obj.makeSomeObject(stringa,stringb,new KeyValue(String1,String2),new KeyValue(String3,String4),new KeyValue(String4,String5));

如何重构我的 makeSomeObject() 方法,以便我可以优雅地将多个 KeyValue 对传递给它,从而使方法调用更简洁易读。

【问题讨论】:

标签: java design-patterns variadic-functions


【解决方案1】:

您可以为Obj 创建一个构建器,这将为您提供一种比在您的问题中使用静态方法更流畅的方式来构建Obj

public class ObjBuilder {
    private String a;
    private String b;
    private List<KeyValue> keyValues = new ArrayList<>();

    private ObjBuilder() {}

    public static ObjBuilder obj() {
        return new ObjBuilder();
    }

    public ObjBuilder withA(String a) {
        this.a = a;
        return this;
    }

    public ObjBuilder withB(String b) {
        this.b = b;
        return this;
    }

    public ObjBuilder withKeyValue(KeyValue keyValue) {
        this.keyValues.add(keyValue);
        return this;
    }

    public Obj build() {
        // whatever Obj.makeSomeObject does to create the Obj instance
    }
}

然后当你需要创建Obj

Obj obj = ObjBuilder.obj()
            .withA("some String")
            .withB("some String")
            .withKeyValue(new KeyValue("A", "B"))
            .withKeyValue(new KeyValue("C", "D"))
            .build();

显然在您的问题中使用它而不是静态可变参数方法在很大程度上是一种风格选择

【讨论】:

    【解决方案2】:

    如果它有超过 3 个(我个人不喜欢超过 3 个,因为它会导致我的可读性问题),您总是可以将 args 包装为对象的形式。 类可以有 String a, String b, Map&lt;K,V&gt; vals 这样的成员(请为成员使用更好的名称)。

    【讨论】:

      【解决方案3】:

      使用 MapList 的 KeyValue

      makeSomeObject(String a,String b,Map<String,String> keyValue)
      {
      }
      
      Map<String,String> keyValue=new HashMap<String,String> ();
      keyValue.put(key1,value1);
      keyValue.put(key2,value2);
      .................
      Obj.makeSomeObject(stringa,stringb,keyValue);
      

      或,

      makeSomeObject(String a,String b,List<KeyValue> keyValues)
      
      List list=new ArrayList<KeyValue>();
      list.add(new KeyValue(a,b));
      list.add(new KeyValue(c,d));
      .........
      Obj.makeSomeObject(stringa,stringb,list);
      

      【讨论】:

        【解决方案4】:

        你可以使用variable argument

        makeSomeObject(String a,String b,KeyValue... arguments) {}
        

        例子:-

        makeSomeMethod("firstString", "secondString", new KeyValue(1,"one"),new KeyValue(2, "two"));
        
        public static void makeSomeMethod(String a,String b,KeyValue... keyValues){
            for(KeyValue kv: keyValues)
                //Anything you want with kv
                System.out.println(kv.toString());
        }
        

        【讨论】:

        • 如果您阅读问题中的代码片段,您会发现它们已经在使用可变参数。被问到的问题是关于传递多个参数的替代方法
        猜你喜欢
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 2015-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多