为什么我们需要为Uri.Builder对象调用"build()"来传入URL构造函数?

Why do we need to call "build()" for Uri.Builder object to pass in URL constructor?

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

我发现大多数人对 Uri.Builder 对象使用 build(),然后将它(使用 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;
}

谢谢。

java.net.URL 具有重载的构造函数:其中一个接受 URI,另一个接受字符串。
所以两者都有效:

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构造函数。