【问题标题】:Why do we need to call "build()" for Uri.Builder object to pass in URL constructor?为什么我们需要为 Uri.Builder 对象调用“build()”来传入 URL 构造函数?
【发布时间】:2019-07-14 18:10:13
【问题描述】:

我现在正在学习 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;
}

谢谢。

【问题讨论】:

    标签: java android url uri


    【解决方案1】:

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

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2015-02-24
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多