2014-11-06 15 views
5

stavo attraversando pacchetto java.net e read this:Come vengono scritti gli URL una sola volta?

URL sono oggetti "write-once". Una volta creato un oggetto URL, non è possibile modificare alcuno dei suoi attributi (protocollo, nome host, nome file o numero di porta ) da .

Ma, se guardiamo in java.net.URL troveremo questo:

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

e

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

Quindi, so che queste sono protette metodi, ma questi è possibile accedere via

public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac) 

Quindi, la mia domanda è, se quella affermazione che ho citato in cima è vaga o l'ho solo fraintesa?

+0

Si prega di fornire un link al tuo preventivo "URL sono write-once ...". Quindi possiamo capire meglio il contesto – CocoNess

+0

Guardate in fondo a questo: http://docs.oracle.com/javase/tutorial/networking/urls/creatingUrls.html – dosdebug

+3

La domanda probabilmente è meglio chiedersi, "è è appropriato usare un "URLStreamHandler" inventato per modificare campi altrimenti immutabili? " A meno che tu non stia facendo qualcosa nello spirito dello scopo di 'URLStreamHandler', probabilmente la risposta è no. –

risposta

4

Gli URL sono oggetti "write-once" di (che utilizzano solo gli oggetti URL). Non puoi modificarli.

URL s devono essere creati e inizializzati internamente, a volte, quindi qualcuno deve modificarli. In teoria ciò dovrebbe essere fatto nel suo costruttore, ma ciò perderebbe la flessibilità. URL s possono puntare a una varietà di oggetti e l'implementazione per accedervi e gestirli non è limitata alla libreria standard, è possibile scrivere implementazioni per gestire protocolli personalizzati.

Btw, in Java 8 non sono protected, ma confezionano privato che è ancora più restrittiva (ma non che è veramente importante in quanto URL classe è dichiarata final in ogni caso quindi non è possibile ereditare da essa).

Edit: Esempio

La classe URL ha molti costruttori: alcuni consente di specificare le diverse parti del URL del tipo di protocollo, host, la porta, ecc, e ci sono alcuni che permette di specificare l'URL come uno String: spec.

In quest'ultimo caso (se l'URL è specificato come uno String), le diverse parti dell'URL (protocollo, host, porta ecc.) Devono essere analizzate dallo String.Questa analisi viene effettuata da un che durante l'analisi del String nell'implementazione del metodo URLStreamHandler.parseURL() deve utilizzare il metodo URL.set() per impostare le diverse parti "indietro" sulla classe URL perché i campi contenenti queste parti sono private e non ci sono metodi di setter per loro.

Poiché l'analisi viene eseguita in un'altra classe (URLStreamHandler), URL fornisce un metodo non pubblico per ricevere il risultato di analisi. Ciò fornisce la flessibilità in quanto è possibile sostituire/estendere il URLStreamHandler ma consente ancora di dichiarare URLfinal e di essere "write-once".

+0

Nevermind. Sto parlando di 1.7.15 – dosdebug

+0

Hai detto che non puoi modificarli, giusto? Ma ho il controllo di URLStreamHandler e posso modificarlo tramite questo, no? – dosdebug

+0

@ Mr.777 Vedi la risposta modificata. – icza

1

Citando la documentazione ufficiale (net/URL.html) per i "set" metodi

Imposta i campi dell'URL. Questo non è un metodo pubblico, quindi solo URLStreamHandlers può modificare i campi URL. Gli URL sono altrimenti costanti.

Il "contrario" mi fa pensare che solo i 2 metodi "set" possono modificare un oggetto URL e non è possibile modificarlo utilizzando altre operazioni diverse da un metodo "set". Sono un'eccezione;)

1

Se si esamina la documentazione per l'URL di classe, ci sono public Getter (ad es. getPort) ma nessun metodo di incastonatore. Il metodo set è protetto e non è possibile accedervi dall'esterno del pacchetto.

È tuttavia possibile riassegnare un oggetto URL, a condizione che l'oggetto non sia definitivo.

ad es.

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

url1 = url2; 

Penso che la dichiarazione che fornite dalla documentazione è molto vaga

+0

Grazie ... Questo è quello che ho detto – dosdebug

Problemi correlati