为什么我们需要为Uri.Builder对象调用“ build()”以传递URL构造函数?

时间:2019-07-14 18:10:13

标签: java android url uri

我现在正在学习URL,在构建Uri并将其传递给URL构造函数时,我会感到困惑。

我发现大多数人都将build()用于Uri.Builder对象,然后将其(使用toString())传递到URL构造函数中。但是,我发现我可以只传递我的UriBuilder对象,并使用toString()到URL构造函数中,这也可以工作。那么,有什么区别呢?优点和缺点是什么?

public static URL buildUrl(String githubSearchQuery) {
    Uri.Builder uriBuilder = Uri.parse(GITHUB_BASE_URL).buildUpon();

    uriBuilder.appendQueryParameter(PARAM_QUERY, githubSearchQuery);
    uriBuilder.appendQueryParameter(PARAM_SORT, sortBy);

    //Uri uri = uriBuilder.build();

    URL url = null;

    try {
        url = new URL(uriBuilder.toString());
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }

    return url;
}

谢谢。

1 个答案:

答案 0 :(得分:1)

java.net.URL具有重载的构造函数:其中一个接受URI,另一个接受一个String。
因此,两者都是有效的:

url = new URL(uriBuilder.toString()); // pass a String
url = new URL(uriBuilder.build());  //  pass an android.net.Uri

这在两种情况下均有效,因为UriBuilder.toString() is overrided to以其文本经典格式呈现当前建筑物URI:

  public String toString() {
        @SuppressWarnings("StringEquality")
        boolean cached = cachedString != NOT_CACHED;
        if (cached) {
            return cachedString;
        }
        StringBuilder sb = new StringBuilder();
        sb.append(scheme).append(':');
        sb.append(getEncodedSchemeSpecificPart());
        if (!fragment.isEmpty()) {
            sb.append('#').append(fragment.getEncoded());
        }
        return cachedString = sb.toString();
    }

但这是一种技巧,因为toString()即使不可能在下一版本中更改其实现,也不允许您将其作为有效的文本URI传递给URL构造函数。