Il modificatore di accesso protected consente ai membri della classe di essere visibili all'interno dello stesso pacchetto (package) e in tutte le sottoclassi (subclass), anche se si trovano in pacchetti diversi.
Differenze rispetto ad altri modificatori:
private — accesso solo all'interno della classe correnteprotected — accessibile all'interno del pacchetto corrente e nelle sottoclassi esterne al pacchettopublic — accessibile ovunqueEsempio:
package com.example.base; public class Parent { protected void sayHello() { System.out.println("Hello from parent"); } } package com.example.child; import com.example.base.Parent; public class Child extends Parent { public void tryHello() { sayHello(); // Accesso consentito! } } public class NotChild { public void fail(Parent p) { // p.sayHello(); // Errore: accesso negato } }
Può una classe esterna (che non è una sottoclasse) accedere a un metodo
protectedda un altro pacchetto, avendo un oggetto di quella classe?
Risposta: No, l'accesso al metodo protected da un altro pacchetto è consentito solo alle classi eredi, e solo tramite this o tramite un riferimento all'oggetto ereditato, non al genitore.
Parent p = new Child(); p.sayHello(); // Errore! ((Child) p).sayHello(); // Successo (se invocato all'interno di Child)
Storia
In un grande progetto modulare, uno sviluppatore ha collocato metodi aziendali importanti nella sezione
protected, pensando che non fossero accessibili al di fuori del pacchetto. Altri sviluppatori hanno accidentalmente utilizzato questi metodi nei test nello stesso pacchetto e, a causa del successivo spostamento delle classi, sono emersi errori di accesso inaspettati.
Storia
Nel progetto di microservizi, è stato tentato di chiamare un metodo con accesso protected tramite un riferimento al tipo genitore in un altro pacchetto — la chiamata non funzionava. Questo ha causato un fallimento in parte dei meccanismi di estensione del sistema, poiché ci si affidava a una comprensione errata dell'ambito di visibilità.
Storia
In una libreria open-source, sono stati usati distrattamente campi protected, che si sono rivelati accessibili a un numero troppo ampio di classi, consentendo accidentalmente di danneggiare lo stato interno dell'oggetto, causando problemi in applicazioni di terze parti.