ProgrammazioneSviluppatore Java

Descrivi come funziona il modificatore di accesso protected in Java, quali sono le sue differenze rispetto ad altri modificatori e quali errori si commettono a causa di una comprensione errata.

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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 corrente
  • default (senza modificatore) — accessibile solo all'interno del pacchetto corrente
  • protected — accessibile all'interno del pacchetto corrente e nelle sottoclassi esterne al pacchetto
  • public — accessibile ovunque

Esempio:

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 } }

Domanda insidiosa.

Può una classe esterna (che non è una sottoclasse) accedere a un metodo protected da 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)

Esempi di errori reali dovuti alla mancanza di conoscenza delle sottigliezze dell'argomento.


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.