簡體   English   中英

在Java中將許多參數傳遞給方法的最佳方法

[英]best way to pass many arguments to a method in Java

我有辦法

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對傳遞給它,從而使方法調用更簡潔,更易於閱讀。

使用Map或鍵值List

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

如果它大於3(我個人不希望大於3,因為它對我造成可讀性問題),則始終可以將args以對象的形式包裝。 類可以具有String a, String b, Map<K,V> vals之類的成員(請為成員使用更好的名稱)。

您可以為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方法使用此選項在很大程度上是一種樣式選擇

您可以使用可變參數

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM