URL如何写一次?

时间:2014-11-06 07:33:26

标签: java url

我正在浏览java.net包和read this

  

网址是“一次写入”对象。一旦你创建了一个URL对象,你就可以了   无法更改其任何属性(协议,主机名,文件名或   端口号)。

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

protected void set(String protocol, String host,
                       int port, String file, String ref)

protected void set(String protocol, String host, int port,
                       String authority, String userInfo, String path,
                       String query, String ref)

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

访问这些方法
public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac)

所以,我的问题是,如果我引用的声明含糊不清或者我误解了它?

3 个答案:

答案 0 :(得分:4)

网址是(他们只使用URL个对象)的“一次编写”对象。你无法修改它们。

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

顺便说一句,在Java 8中它们不是protected,而是包私有,它更具限制性(但不是因为URL类被声明为final所以它真的很重要所以你不能继承它)。

编辑:示例

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

在后一种情况下(如果URL指定为一个spec),则必须从String解析URL的不同部分(协议,主机,端口等)。此解析由URLStreamHandler完成,在URLStreamHandler.parseURL()方法的实现中解析String时,必须使用String方法将“不同部分”设置为“返回”到URL.set()类,因为包含这些部分的字段为URL,并且没有针对它们的setter方法。

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

答案 1 :(得分:1)

从官方文档(net / URL.html)引用“set”方法

  

设置URL的字段。这不是一个公共方法,因此只有URLStreamHandlers可以修改URL字段。 网址不变

“否则”使我认为只有2个“set”方法可以修改URL对象,并且不能使用除“set”方法之外的任何其他操作来修改它。它们是一个例外;)

答案 2 :(得分:1)

如果您查看类URL的文档,则有public个Getters(例如getPort),但没有Setter方法。 set方法受到保护,无法从包外部访问。

如果你的对象不是最终的,你可以重新分配一个URL对象。

e.g。

URL url1 = new URL ("http://www.example1");
URL url2 = new URL ("http://www.example2");

url1 = url2;

我认为您从文档中提供的声明非常模糊