繁体   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