Java HR: Modyfikatory dostępu

Java HR: Modyfikatory dostępu

Do czego służą słowa kluczowe private, protectedpublic? 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ą?


W kolejności od najbardziej otwartego, do najbardziej ograniczającego dostęp:
  • 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.

Wszystkie artykuły autora>>

Dodaj komentarz