2014-11-06 44 views
5

我所经历的java.net包和read thisURL如何写入一次?

URL是“写一次”的对象。一旦创建了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

请提供一个链接到你的报价“URL是写一次......”。所以我们可以更好地理解上下文 – CocoNess 2014-11-06 07:47:09

+0

看看这个最底部: http://docs.oracle.com/javase/tutorial/networking/urls/creatingUrls.html – dosdebug 2014-11-06 07:48:26

+3

问题可能是更好的问:“是吗?适合使用一个人为的'URLStreamHandler'来改变那些不可改变的字段?“除非你本着'URLStreamHandler'的精神来做事,否则答案可能不是。 – 2014-11-06 07:53:47

回答

4

网址是“一次写入”对象(谁只是使用URL对象)。你不能修改它们。

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

顺便说一下,在Java 8它们不是protected,但包专用这更加严格的(但不是它真的很重要,因为URL类被声明final无论如何,所以你不能继承它)。

编辑:实施例

URL类有许多构造函数:一些允许指定等协议,主机,端口等的URL的不同部分,并有一些其允许用户指定的URL作为一个Stringspec

在后一种情况下(如果URL被指定为一个String),URL的不同部分(协议,主机,端口等)必须从String进行解析。这个解析是通过URLStreamHandler完成的,当完成在执行URLStreamHandler.parseURL()方法时解析String方法必须使用URL.set()方法来将不同部分设置为“返回”到URL类,因为持有这些部分的字段是private并且没有为他们设置方法。

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

+0

没关系。我说的是1.7.15 – dosdebug 2014-11-06 07:42:55

+0

你说过,你不能修改它们,对吧?但是我在控制URLStreamHandler,我可以通过它修改它,不是吗? – dosdebug 2014-11-06 07:45:55

+0

@ Mr.777查看编辑答案。 – icza 2014-11-06 07:46:12

1

从官方文档(网/ URL.html)报价为 “设置” 方法

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

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

1

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

虽然你可以重新分配一个URL对象,只要你的对象不是最终的。

例如

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

url1 = url2; 

我认为你从文档中提供的声明很模糊

+0

谢谢...这就是我说的 – dosdebug 2014-11-06 09:28:42