2013-08-22 18 views
6

Amo il controllo degli accessi in qualsiasi lingua, ma trovo che in Java non utilizzo quasi mai (mai) il modificatore di accesso package-private (o la sua mancanza).Quando dovrei usare package-private in Java?

mi rendo conto che le classi interne possono essere private, protected o package-private, ma le classi esterne può essere solo package-private o public. Perché una classe esterna può essere package-private ma non protected? Qual è il vantaggio di restringere classi/metodi/campi per essere visto dall'intero pacchetto, ma non da sottoclassi?

risposta

13

Uso le classi e i metodi package-private quando voglio nascondere i dettagli di implementazione dagli utenti (e da altre classi) al di fuori del pacchetto.

Ad esempio se ho un'interfaccia e una classe factory che crea istanze di quell'interfaccia, potrei avere la classe di implementazione come un file separato ma contrassegnarlo come pacchetto-privato in modo che altri non possano usarlo, né ingombrare il JavaDoc (se javadoc è impostato per mostrare solo pubblico).

Se si sigilla il file jar, i metodi package-private possono anche aiutare a limitare chi può accedere a questi metodi. Se un metodo è pubblico o protetto, le sottoclassi possono ancora vedere e chiamare quel metodo anche se si trova in un pacchetto diverso. (I vasetti non sigillati consentono a chiunque di creare classi nei pacchetti in modo da ottenere l'accesso ai metodi protetti o privati)

2

In molti casi, le classi peer nello stesso pacchetto hanno lo stesso autore, quindi conosce il modo interiore queste classi funzionano o, in altre parole, conosce la logica incapsulata di queste classi. In questo modo può assicurarsi che gli accessi privati ​​ai pacchetti tra le classi aderiscano alla logica incapsulata della classe accessibile e che questi accessi non infrangono nulla.

Questi accessi diretti sono spesso utili per le ottimizzazioni e per ridurre la quantità di codice sorgente.

Per la parte domanda perché le classi esterne possono essere package-private, ma non protette, non ho risposta.

Problemi correlati