sabato 8 maggio 2010

Java: classi interne, locali e statiche

Il concetto proposto da Java sulle classi interne è molto semplice: una classe interna è una classe il cui codice risiede all'interno di un'altra classe. Molto spesso si parla di classi annidate. Detto ciò occorre focalizzare l'attenzione su cosa può fare una classe interna in più rispetto alle normali classi.
Una classe interna ha una visibilità ridotta alla sola classe che la contiene, gli oggetti della classe interna, poi, possono accedere ai campi dell'oggetto della classe contenitore. L'uso delle classi interne è particolarmente utile nella definizione di callback (classi anonime) e nella gestione degli eventi. Andiamo per ordine, esistono quattro tipi di classi interne:
  • classe interna di primo livello: la classe interna ha l'identificatore static. Se la classe interna non fa riferimento all'oggetto della classe esterna è possibile dichiarare la classe interna come statica, in questo caso non verrà creato alcun riferimento all'oggetto della classe esterna. Detto in altre parole, una classe interna statica è locale alla classe che la contiene. L'istanza di oggetti appartenenti a classi interne statiche non è legata, allora, agli oggetti della classe contenitore ma alla stessa classe contenitore;
  • classe interna membro: la classe interna non ha l'identificare static (che è solitamente private) e può accedere a tutti i campi della classe contenitore. L'istanza di un oggetto della classe interna è legata all'istanza dell'oggetto della classe contenitore;
  • classe interna locale: la classe interna è locale al metodo che la contiene (e quindi non alla classe o all'oggetto), è cioè una variabile locale del metodo. Può accedere ai campi della classe che la contiene, ad ogni sua variabile, a patto che queste siano di tipo final;
  • classe interna anonima: è una classe locale (a un metodo) che viene istanziata una sola volta. In tal caso, allora, Java permette di creare l'oggetto senza preoccuparsi del nome da dare allo stesso;
Per la JVM le classi interne vengono compilate in file separati, il nome che la JVM assegna a questi lascia comunque intendere le relazioni esistenti fra le classi contenute e quelle contenitore. Se ad esempio la classe A contiene la classe B, la compilazione assegna ad A il file A.class (come solitamente avviene) e a B il file A$B.class.

Nessun commento:

Posta un commento