我现在正在学习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;
}
谢谢。
答案 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构造函数。