Modyfikatory dostępu: Strażnicy Twojego kodu
Wyobraź sobie, że budujesz dom. Niektóre pomieszczenia, jak salon, są otwarte dla gości. Inne, jak sypialnia, są w pełni prywatne. Z kolei dostęp do schowka z narzędziami mają tylko członkowie Twojej rodziny. W programowaniu obiektowym, a w szczególności w Javie, potrzebujemy podobnego mechanizmu kontrolowania tego, kto ma dostęp do naszych danych i metod.
Służą do tego modyfikatory dostępu. Są to słowa kluczowe, które określają poziom widoczności (dostępności) klas, metod, konstruktorów i zmiennych. To fundament zasady hermetyzacji (ang. encapsulation), która chroni wewnętrzny stan obiektu przed niepożądaną ingerencją z zewnątrz.
W Javie wyróżniamy cztery poziomy dostępu. Omówimy je zaczynając od najbardziej restrykcyjnego.
private: Moja twierdza
Modyfikator private to najbardziej rygorystyczny poziom ochrony. Jeśli oznaczysz pole lub metodę jako prywatną, będzie ona widoczna tylko i wyłącznie w obrębie klasy, w której została zadeklarowana.
Nikt z zewnątrz – ani inne klasy z tego samego pakietu, ani nawet klasy dziedziczące – nie ma do niej bezpośredniego dostępu.
public class KontoBankowe {
private double saldo; // Pole widoczne tylko w tej klasie
private void sprawdzZabezpieczenia() {
// Wewnętrzna logika, ukryta przed światem
}
}
Złota zasada: Zawsze staraj się czynić pola swojej klasy prywatnymi. Dostęp do nich z zewnątrz powinieneś zapewniać jedynie za pomocą publicznych metod, takich jak gettery (pobierające wartość) i settery (ustawiające wartość).
Domyślny (package-private): Sprawy sąsiedzkie
Jeśli nie użyjesz żadnego modyfikatora dostępu przed zmienną, metodą lub klasą, Java zastosuje tzw. dostęp domyślny (często nazywany package-private).
Oznacza to, że dany element jest widoczny dla wszystkich klas znajdujących się w tym samym pakiecie. Klasy z innych pakietów w ogóle go nie zobaczą. To idealne rozwiązanie dla klas pomocniczych, które mają współpracować ze sobą w ramach jednego modułu, ale nie powinny być wystawiane na zewnątrz.
class NarzedziaLokalne { // Brak modyfikatora = dostęp domyślny
int licznikOperacji; // Widoczne tylko w tym samym pakiecie
}
protected: Dziedzictwo i rodzina
Modyfikator protected to kompromis między prywatnością a otwartością. Element oznaczony w ten sposób jest dostępny:
- Dla wszystkich klas w obrębie tego samego pakietu (tak jak dostęp domyślny).
- Dla wszystkich klas dziedziczących (podklas), nawet jeśli znajdują się one w zupełnie innym pakiecie.
Używamy go najczęściej, gdy projektujemy klasę bazową i chcemy, aby klasy pochodne mogły korzystać z jej wewnętrznych mechanizmów, ale wciąż chcemy ukryć te mechanizmy przed resztą programu.
public class Pojazd {
protected String numerVIN; // Dostępne dla pakietu i podklas (np. klasa Samochod)
}
Pakiet (package) to po prostu folder, który zawiera pliki z klasami.
public: Otwarte dla wszystkich
Jak sama nazwa wskazuje, modyfikator public oznacza całkowity brak restrykcji. Klasy, metody lub zmienne publiczne są widoczne z każdego miejsca w programie, z dowolnego pakietu, dla każdej innej klasy.
To okno na świat Twojej aplikacji. Interfejsy (API), które udostępniasz innym programistom do korzystania z Twojego kodu, składają się właśnie z metod i klas publicznych.
public class Uzytkownik {
public void zaloguj() {
// Metoda, którą każdy może wywołać
}
}
Podsumowanie i matryca widoczności
Aby łatwiej zapamiętać, kto ma do czego dostęp, spójrz na poniższą tabelę. Pokazuje ona widoczność elementu w zależności od użytego modyfikatora.
| Modyfikator | Ta sama klasa | Ten sam pakiet | Podklasa (inny pakiet) | Cały świat |
| public | Tak | Tak | Tak | Tak |
| protected | Tak | Tak | Tak | Nie |
| brak (domyślny) | Tak | Tak | Nie | Nie |
| private | Tak | Nie | Nie | Nie |
Pamiętaj: Zawsze stosuj zasadę najmniejszego uprzywilejowania. Zaczynaj od private, a kolejne, luźniejsze modyfikatory dodawaj tylko wtedy, gdy jest to absolutnie konieczne dla działania programu. Dzięki temu Twój kod będzie bezpieczny, łatwiejszy w utrzymaniu i mniej podatny na błędy.