Le classi interne locali – Lezione 15 di Java Avanzato

Cosa sono e perchè vengono utilizzate le classi locali?

Se la definizione di una classe si trova all’interno di un metodo si ha un caso particolare di classe interna, chiamata classe locale. In genere queste tipo di classi vengono utilizzate solo una volta, tipicamente per istanziare un oggetto che verrà mascherato con una classe o interfaccia nota.

Una classe locale non ha nessun specificatore di visibilità, è visibile solo all’interno del metodo in cui è dichiarata. Non può avere il modificatore static, in quanto eredita il suo essere statica o meno dal metodo in cui è dichiarata. Questa scelta è dovuta al fatto di rendere minima la visibilità utile per l’assoluzione del suo scopo.

Le classi locali godono di tutte le proprietà della classi interne ad eccezione delle variabili locali e dei parametri formali del metodo in cui sono contenute. Questi ultimi vengono visti soltanto se sono stati dichiarati final (costanti) perchè alcune classi locali possono vivere più a lungo del metodo in cui la loro classe è visibile. In particolare l’oggetto della classe interna può essere restituito mascherato da una superclasse o superinterfaccia nota all’esterno, ad esempio Object.

Vediamo un esempio di una classe locale:

  public Ojbect f(int c) {
    classe I {
      g() {
        System.out.print(x);
      }
    }
  }

Abbiamo definito un metodo f in cui è presente una classe locale I con visibilità di default.

Nota: Quando si evoca un metodo le variabili locali della classe vengono copiate altre variabili dedicate, i metodi hanno quindi una copia personale delle variabili. Tale scelta è stata fatta perché al momento dell’invocazione dei metodi le variabili e i parametri vengono collocati sullo stack che poi verrà liberato al termine dell’invocazione.
Le classi locali contenendo una copia delle variabili e dei parametri locali, nel caso in cui le variabili non fossero dichiarate final, al termine dell’esecuzione del metodo l’oggetto continuerebbe a vivere. Se la variabile x venisse modificata, quale valore dovrebbe contenere? Il valore precedente che è terminato o la copia della classe? Se il meccanismo funzionasse anche per variabili non costanti, il “trucco” delle copie delle variabili locali diventerebbe visibile al programmatore, anzichè nascosto. Questo comporta che se una variabile locale non final venisse modificata dopo la creazione di un oggetto della classe interna, un oggetto della classe interna, interrogato successivamente, ricorderebbe il vecchio valore di quella variabile, invece del valore modificato.

Indice Lezione PrecedenteLezione Successiva

Pubblicato in Guide, Java, Programmazione Taggato con: , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*