Le classi interne – Lezione 13 di Java Avanzato

Le classi interne in Java: static, locali e anonime

Java permette di definire una classe (o interfaccia) all’interno di un’altra. Questo tipo particolari di classi vengono chiamate interne o annidate. Le classe che non si trovano all’interno di altre classi vengono chiamate “top level” perchè si trovano al loro “livello massimo”. Le classi interne sono già state trattate nella guida base di Java ma in modo semplicistico, una guida di Java che si rispetti deve spiegare in modo chiaro a completo tutti gli aspetti delle classi interne. In particolare bisogna porre la differenza tra le tre tipologie di classe interna disponibili: static, locale e anonima.

Tale meccanismo arricchisce le possibilità di relazioni tra classi, utilizzando un diagramma di Venn avremo che sono così suddivise:

Diagramma di Venn delle classi interne

Come usare le classi interne di Java?

Con l’introduzione delle classi interne vengono introdotte nuove regole di classe:

  • Una classe interna può avere qualsiasi marcatori di visibilità, quindi anche protected e private. Questa novità consente una stretta collaborazione tra classi interne e top level, in particolare permette di nascondere le classi interne dall’esterno;
  • Uno dei grandi vantaggi delle classi interne è che la classe contenuta e la classe che la contiene non hanno nessun problema di visibilità, ovvero vedono l’intero contenuto della classi in entrambe le direzioni, anche se la visibilità è private. Il beneficio consistente nello svincolamento dalle regole di visibilità, mentre lo svantaggio consiste nella violazione dell’incapsulamento che potrebbe portare a dei disastri se non opportunamente gestito;
  • Ogni oggetto di una classe interna ha un riferimento implicito all’oggetto della classe che l’ha generata (quella che la contiene), ad eccezione delle classi static. Questo riferimento viene stabilito a tempo di compilazione.

Un esempio di classi interne sono le seguenti:

  public class A {

    private class B { // Classe interne privata
      //...
    }

    public static class C extends A { // Classe interna pubblica e statica
      //...
    }

    public class D { // Classe interna pubblica
      //...
    }

  }

Per poter istanziare una classe interna è necessario che essa sia visibile (di conseguenza nell’esempio B non è istanziabile dall’esterno), se visibile occorre un riferimento alla classe che la contiene (come spiegato nella guida base), quindi:

  A a = new A(); // Istanzio la classe esterna A
  A D = a.new D(); // Istanzio la classe interna D

  A.C c = new A.C(); // Instanzio la classe C

Dato che la classe D non è static, ha un riferimento alla classe che la contiene A, per poterla creare bisogna partire dalla classe A. Nel secondo caso, dato che la classe C è di tipo static non ha nessun riferimento alla classe A, può essere istanziata direttamente. La classe C potrà far riferimento alla classe A con A.this, se anche la classe D facesse riferimento ad A con this si avrebbe un errore di compilazione.

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 *

*