Le classi interne anonime – Lezione 16 di Java Avanzato


Classi anonime: classi senza un nome

Esiste un particolare tipo di classe per cui non è necessario specificarne il nome, stiamo parlando della classe anonima. Questo tipo di classe viene definita a partire da una classe già esistente, in particolare una classe anonima può essere dichiarata:

  • A partire da una classe X

      new X (a1, ..., an) {
        //...
      }
  • A partire da un’interfaccia I
      new I () {
        //...
      }

Perchè vengono utilizzate le classi anonime?

Le classi anonime servono ad istanziare momentaneamente oggetti, vengono utilizzate come se fossero delle classi usa e getta. Trovano la loro utilità quando non si vuole scrivere un’intera classe per dover svolgere un singolo compito, di conseguenza si instanza immediatamente una copia della classe e la utilizza. Un grande vantaggio è la lunghezza del codice, molto più breve e compatto rispetto a dover scrivere un’intera classe top level. Riscrivendo la classe dell’esempio precedente X senza utilizzare le classi anonime avremo un codice molto più lungo:

  class Y extends X {
    public Y (T1 b1, ..., Tn bn) {
      super(b1, ..., bn);
    }

    // Corpo del metodo
  }

Una classe anonima viene definita quando è istanziata, si tratta di un processo inscindibile e siccome non ha un nome non può essere riutilizzata. Per definizione le classe anonime non hanno un costruttore, possono essere create solo a partire dai costruttori già esistenti.
Le classi anonime vengono utilizzate solo in casi eccezionali, quando non si vuole iscrivere un’intera classe. Essendo utilizzate non in maniera sistematica, il loro uso non è mai per esigenze progettuali.

Le classi anonime hanno le stesse proprietà delle classi interne. Il loro uso più comune è con l’implementazione di interfacce e possono trovarsi sia nei metodi che nell’inizializzazione degli attributi. Un esempio molto noto in cui si utilizza la classe anonima è con il gestore degli eventi:

  interface ActionListener {
    void actionPerformed(ActionEvent e);
  }

L’interfaccia ActionListener viene spesso implementata da una classe anonima quando si vuole far compiere un’azione alla pressione di un bottone:

  class A {
    public ActionListener getButtonListener(final JButton b) {
      return new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          // Reazione alla pressione del bottone
        }
      };
    }
  }

In quest’esempio viene utilizzata una classe anonima che implementa localmente un ActionListener in cui si sovrappone il metodo actionPerformed.

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 *

*