W Javie package-private to "domyślny" poziom dostępu (bez wskazywania modyfikatorów publiczności: public, protected, private). Taki człon klasy (metoda, pole lub sama klasa) jest dostępny tylko z klas znajdujących się w tej samej paczce.
class MyClass { /* ... */ } void doSomething() { /* ... */ }
Przykład:
// Plik: com/example/internal/Helper.java class Helper { static void help() { System.out.println("helped"); } }
Zawsze stosuj package-private, jeśli klasa lub metoda jest wewnętrznym szczegółem implementacji.
Pytanie: Czy klasa package-private może być widoczna w innej paczce przez dziedziczenie lub import?
Odpowiedź: Nie, do członów package-private nie można uzyskać dostępu ani przez dziedziczenie, ani przez import z innych paczek — są dostępne tylko wewnątrz swojej paczki.
Historia
W dużym projekcie różne zespoły zaczęły używać klas package-private do logiki użytkowej. Kiedy próbowano ponownie wykorzystać kod z innych paczek, nie było to możliwe — dostęp był niemożliwy. W rezultacie trzeba było uczynić klasy publicznymi, co ujawniło wewnętrzną implementację.
Historia
W projekcie wielomodułowym klasy package-private stały się przyczyną problemów podczas pisania testów modułowych: testy w innej paczce nie zobaczyły metod package-private i trzeba było przenieść testy do oryginalnej paczki lub osłabić poziom dostępu.
Historia
Przy migracji kodu do nowej paczki wystąpiły nieoczekiwane błędy kompilacji — wiele metod i klas nagle "zniknęło", ponieważ były package-private i stały się niedostępne po zmianie paczki.