Classi anonime in java

Le classi anonime sono un meccanismo di java che consente di rendere il codice più conciso e leggibile. Esse consentono sostanzialmente di dichiarare ed instanziare una classe allo stesso tempo. Di fatto sono simili alle classi locali (o nidificate o interne) con la differenza che non hanno nome e non possono essere riutilizzate. Inoltre le classi locali sono definite all’interno di un blocco di codice class {...} mentre le classi anonime sono definite in una espressione.

Un semplice esempio di classe anonima comunemente utilizzata è quella che implementa l’interfaccia java.util.Comparator per eseguire l’ordinamento di una lista come mostrato nell’esempio seguente:

 Sintassi

Come detto precedentemente una classe anonima una espressione, la cui sintassi è simile all’invocazione di un costruttore con la differenza che contiene al suo interno la definizione di una classe. La sintassi quindi è la seguente:

  • l’operatore new;
  • il nome dell’interfaccia da implementare o della classe da estendere;
  • parentesi che contengono gli argomenti del costruttore, a meno che non si implementi una interfaccia, come nell’esempio, allora ci saranno solamente la parentesi aperta e chiusa;
  • il corpo della classe che implementa tutti i metodi dell’interfaccia o riscrive quelli della classe.

Con un maggiore formalismo possiamo descrivere la sintassi delle classi anonime nel modo seguente:

new class-name ( [ argument-list ] ) { class-body }

oppure

new interface-name () { class-body }

Accesso e visibilità

Le classi anonime si comportano esattamente come quelle interne, dalle quale si distinguono solamente per la sintassi utilizzata per la loro definizione ed istanziazione.

Le classi anonime non ha il modificatore di visibilità, in quanto sono visibili solo all’interno del metodo in cui sono dichiarate. Inoltre non hanno il modificatore static, poiché ereditano il lore essere statiche o meno dal metodo in cui sono dichiarate.

Oltre a godere delle proprietà comuni alle classi interne, le classi anonime hanno accesso alle variabili locali e i parametri formali del metodo in cui sono contenute, a patto che essi siano dichiarati final, cioè costanti. Questo perché la JVM, all’attivazione del metodo che definisce la classe anonima, inserisce un record di attivazione nello stack, ed alloca in esso i parametri formali e le variabili locali del metodo. Poiché però  tale metodo può avere una vita più breve della classe anonima, i riferimenti a tali variabili possono essere cancellati quando la classe anonima ha ancora bisogno di accedervi.

Per ovviare a ciò la JVM inserisce nella classe anonima delle copie dei parametri e delle variabili definite nel metodo, ed essendo delle mere copie, solamente quelle dichiarate costanti garantiscono di avere lo stesso valore delle originali (in quanto non modificabili all’interno del metodo).

Quando utilizzarla

La decisione tra utilizzare una classe locale o una anonima è generalmente una questione di stile del programmatore. In generale la scelta dovrebbe ricadere sulla soluzione che rende il codice più leggibile. Le sole linee guida che forniscono gli ingegneri della SUN sono relative esclusivamente allo stile di scrittura di una classe anonima. Ovvero:

  1. La parentesi graffe di apertura della definizione della classe non dovrebbe essere isolate su una riga, ma invece seguire la parentesi tonda di chiusura nell’operatore new. Analogamente l’operatore new deve, quando possibile, apparire sulla stessa riga dell’espressione di assegnazione di cui fa parte.
  2. Il corpo della classe anonima deve essere indentato rispetto al punto di inizio della linea che contiene l’operatore new.
  3. La parentesi graffa che chiude una classe anonima non dovrebbe essere isolata su una riga, ma dovrebbe essere seguito dal resto dell’espressione che la contiene. Spesso si tratta di un punto e virgola o una parentesi chiusa seguita da un punto e virgola. Questo punteggiatura indica al lettore che questo non un blocco di codice ordinaria e rende più facile identificare classi anonime.

© 2019 Java Boss - Theme by HappyThemes