W Javie do zarządzania dostępem do pól, metod i klas używane są modyfikatory dostępu: private, default (package-private), protected, public.
Historia pytania:
Wczesne wersje Javy stosowały surową enkapsulację obiektów. Aby zapewnić elastyczność, wprowadzono różne poziomy dostępu, aby wspierać zarówno pełną zamkniętość, jak i rozszerzalność (dziedziczenie i dostęp w ramach pakietu).
Problem:
Błędny wybór modyfikatora może prowadzić do naruszenia enkapsulacji, problemów z dziedziczeniem, braku możliwości testowania lub nawet do błędów związanych z bezpieczeństwem, jeśli dane stają się publiczne przez pomyłkę.
Rozwiązanie:
Używaj najbardziej zamkniętego modyfikatora, który dopuszcza twoja architektura. Pola zazwyczaj są oznaczane jako private, zapewniając dostęp do nich przez getter/setter. Metody powinny być public tylko jeśli są częścią API, a dla rozszerzeń — protected.
Przykład kodu:
public class Person { private String name; // zamknięte pole protected int age; // dostępne w pakiecie i dziedziczących String email; // package-private public String getName() { return name; } }
Kluczowe cechy:
private — dostępne tylko wewnątrz klasyprotected — dodatkowo dostępne dla dziedziczących nawet z innych pakietówpublic — dostępne dla wszystkichCzy można zastosować modyfikator dostępu do lokalnych zmiennych?
Nie. Modyfikatory dostępu są stosowane tylko do klas, metod i pól/klas wewnętrznych, ale nie do lokalnych zmiennych.
Czy można stworzyć klasę wewnątrz metody z modyfikatorem public?
Nie. Klasa lokalna nie może być zadeklarowana z modyfikatorem dostępu, zawsze ma zakres widoczności wewnątrz metody.
Czy protected-członek jest dostępny dla klas dziedziczących w innym pakiecie?
Tak, członkowie protected są dostępni dla dziedziczących, nawet jeśli znajdują się w innych pakietach, ale nie dla zwykłych klas w innym pakiecie.
Wszystkie pola klasy przypadkowo zadeklarowane jako public — są bezpośrednio dostępne z innych klas, trudno śledzić miejsce zmian.
Zalety:
Wady:
Wszystkie pola są private, a publiczne metody kontrolują dostęp z walidacją, tylko potrzebne części są oznaczone jako protected dla rozszerzenia w dziedziczeniu.
Zalety:
Wady: