2014-11-06 50 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