URL如何写一次?

Sha*_*zad 5 java url

我正在浏览java.net包并阅读:

URL是"一次写入"对象.创建URL对象后,您无法更改其任何属性(协议,主机名,文件名或端口号).

但是,如果我们查看java.net.URL,我们会发现:

protected void set(String protocol, String host,
                       int port, String file, String ref)
Run Code Online (Sandbox Code Playgroud)

protected void set(String protocol, String host, int port,
                       String authority, String userInfo, String path,
                       String query, String ref)
Run Code Online (Sandbox Code Playgroud)

所以,我知道这些是受保护的方法,但可以通过这些方法访问

public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac)
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,如果我在上面引用的那个陈述是模糊的,或者我只是误解了它?

icz*_*cza 4

URL 是您(仅使用URL对象)的“一次写入”对象。您无法修改它们。

URL有时必须在内部创建和初始化,因此必须有人修改它们。最好这必须在其构造函数中完成,但这会失去灵活性。URLs 可以指向各种对象,并且访问和处理它们的实现不限于标准库,您可以编写实现来处理自定义协议。

顺便说一句,在 Java 8 中它们不是protected,而是包私有,这甚至更具限制性(但这并不重要,因为无论如何URL都声明了类final,所以你不能子类化它)。

编辑:示例

URL 类有许多构造函数:有些允许您指定 URL 的不同部分,如协议、主机、端口等,还有一些允许您将 URL 指定为String: spec

在后一种情况下(如果 URL 指定为 one String),必须从 .url 中解析 URL 的不同部分(协议、主机、端口等)String。这个解析是由一个方法完成的URLStreamHandler,当解析完成后,String在方法的实现中URLStreamHandler.parseURL()必须使用该URL.set()方法将不同的部分“返回”到类URL,因为保存这些部分的字段是private并且没有它们的setter方法。

由于解析是在另一个类(URLStreamHandler)中完成的,URL因此提供了一个非公共方法来接收解析结果。这提供了灵活性,因为您可以替换/扩展URLStreamHandler但仍然允许URL声明final并“一次写入”。