In Java, per gestire l'accesso a campi, metodi e classi, si utilizzano i modificatori di accesso: private, default (package-private), protected, public.
Storia della questione:
Le versioni precedenti di Java utilizzavano un'oggettistica di incapsulamento rigorosa. Per maggiore flessibilità sono stati introdotti vari livelli di accesso per supportare sia la completa chiusura che l'estendibilità (ereditarietà e accesso all'interno del pacchetto).
Problema:
La scelta errata del modificatore può portare a violazioni dell'incapsulamento, problemi di ereditarietà, impossibilità di testare o addirittura a bug di sicurezza se i dati diventano accessibili erroneamente.
Soluzione:
Utilizzare il modificatore più ristretto che la propria architettura consente. I campi di solito vengono dichiarati private, consentendo l'accesso tramite getter/setter. I metodi sono public solo se fanno parte dell'API, e per l'estensione, sono protected.
Esempio di codice:
public class Person { private String name; // campo privato protected int age; // accessibile nel pacchetto e dai discendenti String email; // package-private public String getName() { return name; } }
Caratteristiche chiave:
private — accessibile solo all'interno della classeprotected — in aggiunta all'accesso ai discendenti anche da altri pacchettipublic — accessibile a tuttiÈ possibile applicare un modificatore di accesso alle variabili locali?
No. I modificatori di accesso si applicano solo a classi, metodi e campi/classi annidate, ma non a variabili locali.
È possibile rendere una classe all'interno di un metodo con modificatore public?
No. Una classe locale non può essere dichiarata con un modificatore di accesso, ha sempre visibilità all'interno del metodo.
Un membro protected è accessibile da una classe figlia in un altro pacchetto?
Sì, i membri protected sono accessibili ai discendenti, anche se si trovano in altri pacchetti, ma non alle classi normali in un altro pacchetto.
Tutti i campi della classe sono accidentalmente dichiarati public — vi si accede direttamente da altre classi, difficile tracciare il luogo delle modifiche.
Vantaggi:
Svantaggi:
Tutti i campi sono private, e i metodi pubblici controllano l'accesso con validazione, solo le parti necessarie diventano protected per l'estensione nei discendenti.
Vantaggi:
Svantaggi: