Java HR: Modyfikatory dostępu
Do czego służą słowa kluczowe private, protected i public? Kiedy ich używać?
Access modifiers, czyli modyfikatory dostępu to mechanizm w Javie i specjalne słowa kluczowe, dzięki którym możemy określić widoczność poszczególnych części składowych programu – klas oraz ich pól, metod i konstruktorów.
Należy pamiętać, aby zawsze używać możliwie jak najbardziej ograniczającego modyfikatora – dzięki temu uzyskamy największą elastyczność i separację części składowych programu.
Gdzie można ich użyć?
- Klasa, enum, interfejs, adnotacja – public lub default (package-private)
- Klasa, enum, interfejs, adnotacja zagnieżdżone w innej klasie – public, protected, default lub private
- Pole klasy – public, protected, default lub private
- Pole interfejsu – public, można go pominąć, ponieważ pola interfejsu to tak naprawdę stałe statyczne – zawsze (patrz: uwaga niżej) są public static final.
- Metoda klasy, konstruktor – public, protected, default lub private
- Metoda interfejsu – zawsze public, można pominąć
Uwaga – w Javie 9 interfejsy mogą posiadać metody prywatne, więcej informacji tutaj:
https://howtodoinjava.com/java9/java9-private-interface-methods/
Jakie modyfikatory istnieją?
-
public – taki element będzie dostępny dla każdej innej klasy w ramach całego programu/modułu.
Szczególnym przykładem jest metoda main(), która musi być publiczna, aby program mógł zostać poprawnie uruchomiony. - protected – taki element będzie dostępny dla wszystkich elementów w tym samym pakiecie (tak samo jak w package-private), ale też dla wszystkich klas pochodnych (podklas), nawet jeśli znajduje się ona w innym pakiecie.
-
package-private (default) – taki element będzie dostępny we wszystkich klasach w ramach pakietu, w którym został zadeklarowany.
Nie ma jednak w Javie takiego słowa kluczowego – aby z niego skorzystać, nie piszemy w tym miejscu żadnego innego modyfikatora dostępu, stąd też bywa nazywany default. -
private – taki element będzie dostępny tylko w ramach swojej klasy.
Jest to najbardziej restrykcyjny poziom dostępu, wraz z getterami i setterami jest podstawowym narzędziem enkapsulacji (o tym w przyszłości w innym artykule).Ma specjalne zastosowanie będąc zestawionym z konstruktorem: - Nie można takiej klasy rozszerzać.
- W przypadku singletona – możemy ograniczyć swobodę tworzenia nowych obiektów, ukrywając konstruktor i wykorzystując do tego własną metodę.
Relacje te obrazuje poniższy diagram, oparty na oficjalnym tutorialu Java od Oracle (https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html):
Klasa | Pakiet | Podklasa poza pakietem |
Program | |
---|---|---|---|---|
public | + | + | + | + |
protected | + | + | + | |
default | + | + | ||
private | + |
Dodatkowe reguły związane z dziedziczeniem
- Metody public we wszystkich klasach pochodnych muszą być również public
- Metody protected we wszystkich klasach pochodnych muszą być protected lub public
- Metody prywatne nie mogą być dziedziczone
Informatyk, programista. Obecnie Java Developer (Web Fullstack), właściciel studia Berrygames oraz prezes koła TK Games na Politechnice Wrocławskiej.