Kurs Java #16 Modyfikatory dostępu

Java

Loading

W poprzednich lekcjach poznaliście koncepcję klas, metod i pól, więc teraz nasuwa się pytanie: kto ma do tego dostęp? Właśnie tutaj pojawiają się modyfikatory dostępu – mechanizm, który decyduje, które elementy klasy są widoczne, a które pozostają ukryte.

Jeśli próbowaliście użyć metody, a Java odmówiła wykonania, bardzo możliwe, że przyczyną był właśnie modyfikator dostępu.

W tej lekcji dowiecie się, jakie poziomy dostępu oferuje Java i dlaczego warto je stosować.

Wprowadzenie

Modyfikatory dostępu określają widoczność klas, metod, pól oraz konstruktorów. Innymi słowami: wskazują, kto może korzystać z danego elementu, a kto nie powinien nawet wiedzieć o jego istnieniu. Dobrze dobrane modyfikatory chronią logikę aplikacji przed przypadkowym użyciem, ułatwiają rozwój i refaktoryzację kodu oraz ograniczają liczbę błędów.

Java udostępnia cztery poziomy dostępu: public, protected, brak modyfikatora (tzw. default lub package-private) oraz private.

Public – dostęp bez ograniczeń

Element oznaczony jako public pozwala korzystać z niego w każdym miejscu w aplikacji, niezależnie od pakietu.

Przykład:

public class Kalkulator {
    public int dodaj(int a, int b) {
          return a + b;
    }
}

Metoda dodaj działa dla każdej innej klasy. W ten sposób klasa świadomie udostępnia element światu zewnętrznemu.

Stosując public, komunikujecie jasno: element ten należy do interfejsu klasy i możecie z niego korzystać poza jej wnętrzem.

Private – pełna enkapsulacja

Z drugiej strony private pozwala ukryć elementy wewnątrz klasy. Elementy oznaczone tym modyfikatorem nie są widoczne dla innych klas.

Przykład:

public class Użytkownicy {
     private String haslo;

     public boolean poprawneHaslo(String haslo) {
           return this.haslo.equals(haslo);     
     }
}

Pole haslo i metoda poprawneHaslo są całkowicie ukryte przed światem zewnętrznym. Klasa chroni swoje wnętrze i nie pozwala, aby inne fragmenty kodu ingerowały w jej stan.

Dzięki private możecie ukrywać szczegóły implementacji i zmniejszać zależności między klasami, co ułatwia późniejsze modyfikacje.

Brak modyfikatora – dostęp w obrębie pakietu

Jeśli nie zostanie użyty żaden modyfikator, Java nada elementowi domyślny poziom dostępu, zwany package-private.

Przykład:

class RaportGenerator {

      void generuj() {
          System.out.println("Generowanie raportu");
     }
} 

W tym przypadku klasa i metoda działają tylko dla innych klas w tym samym pakiecie. Dzięki temu można logicznie grupować powiązane elementy bez udostępniania ich na zewnątrz.

Dostęp pakietowy okazuje się szczególnie przydatny przy porządkowaniu większych fragmentów aplikacji.

Protected – dziedziczenie i pakiet

Modyfikator protected umożliwia korzystanie z elementu w tym samym pakiecie oraz w klasach dziedziczących, nawet jeśli znajdują się w innym pakiecie.

Przykład:

public class Konto {

      protected double saldo;
}

public class KontoPremium extends Konto {

      public void pokazSaldo() {
            System.out.println(saldo);
     }
}

Pole saldo nie działa dla wszystkich, ale klasa potomna może z niego korzystać. To częste rozwiązanie w hierarchiach klas, gdzie część danych powinna pozostać dostępna tylko dla dziedziczących klas.

Używając protected, zyskuje się większą elastyczność, jednak warto robić to rozważnie, aby utrzymać kod przejrzysty i jasno określić, za co odpowiada każda klasa.

Podsumowanie

Modyfikatory dostępu w Javie pomagają utrzymać porządek w kodzie. public pozwala korzystać z elementów na zewnątrz, private chroni wnętrze klasy, dostęp domyślny porządkuje współpracę w pakietach, a protected wspiera dziedziczenie.
Jeśli dobrze zrozumiecie te mechanizmy, kod stanie się bardziej przejrzysty, przewidywalny i łatwiejszy w utrzymaniu.

W kolejnej lekcji omówimy enkapsulację i hermetyzację oraz dobre praktyki projektowe.

O autorze

Adam Mingielewicz

Tester oprogramowania z pasją do jakości i technologii. Łączy doświadczenie w testach manualnych i automatycznych, koncentrując się przede wszystkim na aplikacjach webowych oraz usługach SOAP i REST. Testowanie to dla niego nie tylko szukanie błędów, ale przede wszystkim kwestionowanie przyjętych założeń i usprawnianie tego, co nie działa – również w samym procesie testowym. Lubi zmieniać, angażować się i aktywnie budować proces testowy, tak by miał sens, a nie tylko formę. Prywatnie fan rocka, biwakowania, podróży.