将许多参数传递给Java中的方法的最佳方法

时间:2015-07-08 07:14:28

标签: java design-patterns variadic-functions

我有一个方法

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对传递给它,以便方法调用更清晰,更易于阅读。

4 个答案:

答案 0 :(得分:2)

使用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);

OR,

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);

答案 1 :(得分:2)

如果它超过3(我个人不喜欢超过3,因为它会导致我的可读性问题),你总是可以以对象的形式包装args。 类可以有Activity之类的成员(请为成员使用更好的名称)。

答案 2 :(得分:2)

您可以为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();

显然在你的问题中使用静态varargs方法主要是一种风格选择

答案 3 :(得分:1)

您可以使用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());
}