Cosa succede realmente (cioè cosa genera il compilatore dalle classi) - 1

"Ciao, Amigo! Ecco qualche informazione in più per te."

"Ti ho già detto che il compilatore in realtà converte tutte le classi anonime in classi interne ordinarie."

"Sì. Ricordo persino che i loro nomi sono numeri: 1, 2, 3, ecc."

"Esattamente. Ma qui c'è un'altra sfumatura."

"Se una classe viene dichiarata all'interno di un metodo e utilizza una qualsiasi delle sue variabili, i riferimenti a tali variabili verranno aggiunti alla classe generata. Guarda tu stesso."

"Iniziamo con questo:"

Prima della compilazione:
class Car
{
 public ArrayList createPoliceCars(int count)
 {
  ArrayList result = new ArrayList();

  for(int i = 0; i < count; i++)
  {
 final int number = i;
   result.add(new Car()
    {
     public String toString()
     {
      return ""+number;
     }
    });
  }
  return result;
 }
}

"E il compilatore genera questo:

Dopo la compilazione:
class Car
{
 public ArrayList createPoliceCars(int count)
 {
  ArrayList result = new ArrayList();

  for(int i = 0; i < count; i++)
  {
   final int number = i;
   result.add(new Anonymous2 (number));
  }
   return result;
  }

 class Anonymous2
 {
  final int number;
  Anonymous2(int number)
 {
  this.number = number;
 }

  public String toString()
  {
   return ""+ number;
  }
 }
}

"Hai capito? La classe interna non può modificare la variabile locale del metodo, perché quando il codice della classe interna viene eseguito, potremmo uscire del tutto dal metodo."

"Ora il secondo punto. Il metodo toString() utilizza una variabile passata. Per ottenere ciò, era necessario:"

A) salvalo all'interno della classe generata

B) aggiungilo al costruttore.

"Capito. Le classi dichiarate all'interno dei metodi usano sempre copie delle variabili."

"Esattamente!"

"Allora ha senso perché le variabili devono essere definitive. E perché non possono essere modificate. Se stai effettivamente lavorando con copie anziché con gli originali, l'utente non capirà perché non può modificare i valori delle variabili, il che significa che dobbiamo semplicemente proibirgli di cambiarli".

"Giusto, dichiarare le variabili come finali sembra un piccolo prezzo da pagare in cambio del fatto che il compilatore generi una classe per te, la passi al metodo e salvi tutte le variabili del metodo che vuoi usare."

"Sono d'accordo. Le lezioni locali anonime sono ancora fantastiche."

"Se dichiaro una classe locale all'interno di un metodo e utilizzo le variabili del metodo al suo interno, il compilatore le aggiungerà anche alla classe?"

"Sì, li aggiungerà alla classe e al suo costruttore."

"È quello che pensavo."