In Java, package-private è il livello di accesso "di default" (senza specificare i modificatori di visibilità: public, protected, private). Tale membro della classe (metodo, campo o stessa classe) è accessibile solo dalle classi dello stesso pacchetto.
class MyClass { /* ... */ } void doSomething() { /* ... */ }
Esempio:
// File: com/example/internal/Helper.java class Helper { static void help() { System.out.println("helped"); } }
Utilizzare sempre package-private se la classe o il metodo è un dettaglio interno dell'implementazione.
Domanda: Può un classe package-private essere visibile all'interno di un altro pacchetto attraverso l'ereditarietà o l'import?
Risposta: No, non è possibile accedere ai membri package-private né tramite ereditarietà né tramite import da altri pacchetti: sono accessibili solo all'interno del proprio pacchetto.
Storia
In un grande progetto, diversi team hanno iniziato a utilizzare classi package-private per la logica utilitaria. Quando il codice è stato tentato di essere riutilizzato da altri pacchetti, non è stato possibile: l'accesso era impossibile. Di conseguenza, le classi hanno dovuto essere rese public, il che ha aperto l'implementazione interna.
Storia
In un progetto a più moduli, le classi package-private hanno causato problemi nella scrittura dei test unitari: i test in un altro pacchetto non hanno visto i metodi package-private, e si è dovuto spostare i test all'interno del pacchetto sorgente o allentare il livello di accesso.
Storia
Durante la migrazione del codice in un nuovo pacchetto ci sono stati errori inaspettati di compile-time: molti metodi e classi sono "scomparsi" inaspettatamente, perché erano package-private e sono diventati inaccessibili dopo il cambio di pacchetto.