我正在浏览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)
所以,我的问题是,如果我引用的声明含糊不清或者我误解了它?
答案 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;
我认为您从文档中提供的声明非常模糊