2014-09-12 24 views
10

Ho fatto molto con l'IO in Java e dopo aver cercato il codice per convertire le primitive in matrici di byte e di nuovo ho trovato la fonte per java.io.Bits su uno dei siti Web di hosting di codice sorgente Java. Dopo una rapida occhiata ho capito che è esattamente ciò di cui ho bisogno, tranne che per il pacchetto privato. Così ho fatto una copia che ho reso pubblico, memorizzato nel pacchetto del mio progetto e utilizzato (solo in progetti personali, te lo assicuro). Lo trovo molto utile.Perché java.io.Bits non è pubblico?

La mia domanda è, perché questo pacchetto è privato? Riesco a vedere che è davvero utile per le persone che lavorano con IO e non vedo alcun svantaggio dal cambiare la visibilità al pubblico (in rt.jar). O forse c'è un equivalente (e per favore non menzionare altre librerie)?

Ecco un link a un sito web scelto in modo casuale che ha sorgente Java per java.io.Bits: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/Bits.java

risposta

8

Dovreste chiedere a uno degli sviluppatori Java per certo, ma rendendolo pacchetto privata, l'API può essere trattata come "interno", cioè potrebbe cambiare o scomparire in qualsiasi momento. Ciò significa che l'API può essere sviluppata in tempi relativamente brevi e non deve passare attraverso lo stesso processo di test relativamente approfondito che le API pubbliche devono attraversare (poiché una volta rilasciati, rimangono bloccati lì per sempre).

In breve, rendere pubblica un'API ha implicazioni a lungo termine e richiede molto, molto più lavoro di un semplice switch.

Mi azzarderei a indovinare che è iniziato come un insieme di funzioni "hacked together" utile per poche altre classi nel pacchetto I/O, e da allora è semplicemente rimasto lì.

+0

Pensi che sia giusto creare una copia personale e distribuirla con un'applicazione? – Nulano

+4

@Nulano - sono abbastanza sicuro che non lo sia. anche se penso che dipenda dalla licenza della tua app. il jdk moderno è GPL, quindi se la tua app è GPL, potrebbe essere ok. – jtahlborn

+0

Guardando a cosa c'è nel codice, direi che è un codice piuttosto banale; chiesto tali metodi qualsiasi programmatore competente presenterà un'implementazione molto simile (se non identica). Anche se non una giustificazione adeguata; Immagino che il codice non sia abbastanza originale da giustificare eventuali richieste di violazione del copyright. – Durandal

3

È un pacchetto privato, certo, ma ci sono API pubbliche che espongono lo stesso comportamento, ad es. ByteBuffer.wrap(array).getInt(index) e gli altri metodi su ByteBuffer. È quasi certamente meglio utilizzare l'API pubblica correttamente progettata e ben documentata rispetto al tentativo di avvolgere o copiare i dettagli di implementazione interni da Java.

+0

Penso che questa sia una risposta che vale la pena accettare, ma dal momento che posso "accettare" "solo una risposta, ottieni solo +1. – Nulano

+0

Non ero sicuro delle prestazioni di ByteBuffer vs java.io.I bit hanno quindi eseguito un test rapido. I risultati mostrano che per la memorizzazione java.io.Bits è il più veloce con BB assoluto subito dopo, e per la lettura BB assoluto è il più veloce con relativo big endian e quindi little littleian following, Bit più lento. Ecco un collegamento pastebin a risultati dettagliati e codice src per il mio test: http://pastebin.com/XStkmN8s – Nulano

+0

Aggiornamento: Ho aggiornato il pastebin per aggiungere test sulla mia macchina Ubuntu. Sono molto favorevoli a java.io.Bits, ma ByteBuffer assoluto big endian è molto vicino. – Nulano