簡體   English   中英

為什么要這樣呢? (使用字符串Namevaluepairs和StringBuilder)

[英]Why do it this way? (use string Namevaluepairs and StringBuilder)

我最近看到了一個示例代碼,該代碼首先創建NameValuePair對象並填充它:

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("Param1", param1));
params.add(new BasicNameValuePair("Param2", param2));
params.add(new BasicNameValuePair("Param3", param3));

然后將其傳遞給另一種方法以將其轉換為一個字符串:

    private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException
{
    StringBuilder result = new StringBuilder();
    boolean first = true;

    for (NameValuePair pair : params)
    {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
    }

    return result.toString();
}

在我看來,這樣做可以得到相同的結果:

String query = "";
query += URLEncoder.encode("Param1", "UTF-8") + "=" + URLEncoder.encode(Param1, "UTF-8")
query += "&" + URLEncoder.encode("Param2", "UTF-8") + "=" + URLEncoder.encode(Param2, "UTF-8")
query += "&" + URLEncoder.encode("Param2", "UTF-8") + "=" + URLEncoder.encode(Param2, "UTF-8")

我的代碼可以工作嗎? 如果沒有,為什么? 如果是,反之,這樣做的好處是什么?

我意識到前者允許您傳遞任意數量的NVP,但是我只是演示了在構建NVP所需的相同行數中,我能夠構建整個POST字符串!

使用NameValuePair的代碼更為通用。 getQuery是可重用的,並且與傳遞給它的對完全無關。

如果您不考慮設計(和語法),那么第一個選擇是等效的。 你的建議行不通的,因為它會逃走了第二個選擇= S和&小號隨着參數。

我認為這確實與可讀性和可重用性有關。 您看到的原始代碼比您建議的單個內聯字符串連接更具可讀性。 小而簡潔的語句傳遞給靈活的方法。 另外,在原始版本中,由於名稱和值保留在單獨的字段中,因此如果需要,可以將名稱List重復用於其他用途,而內聯方法是單一用途。

這兩段代碼應該具有完全相同的性能。 當您查看Java編譯器對字符串連接所做的操作時,它實際上會實例化StringBuilder本身以進行類似於原始代碼的連接。

從性能的角度來看並不重要,因為HTTP參數始終很少。

我個人喜歡這種方式:

 new Uri.Builder()
.scheme("http")
.authority("foo.com")
.path("someservlet")
.appendQueryParameter("param1", foo)
.appendQueryParameter("param2", bar)
.build();

暫無
暫無

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

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