Que se passe-t-il réellement (c'est-à-dire ce que le compilateur génère à partir des classes) - 1

"Salut, Amigo ! Voici quelques informations supplémentaires pour vous."

"Je vous ai déjà dit que le compilateur convertit en fait toutes les classes anonymes en classes internes ordinaires."

« Ouaip. Je me souviens même que leurs noms sont des nombres : 1, 2, 3, etc.

"Exactement. Mais il y a une autre nuance ici."

"Si une classe est déclarée dans une méthode et utilise l'une de ses variables, les références à ces variables seront ajoutées à la classe générée. Voyez par vous-même."

« Nous commençons par ceci : »

Avant de compiler :
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;
 }
}

"Et le compilateur génère ceci :

Après compilation :
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;
  }
 }
}

"Avez-vous compris ? La classe interne ne peut pas modifier la variable locale de la méthode, car au moment où le code de la classe interne est exécuté, nous quittons peut-être complètement la méthode."

"Maintenant le deuxième point. La méthode toString() utilise une variable passée. Pour ce faire, il fallait :"

A) enregistrez-le dans la classe générée

B) ajoutez-le au constructeur.

"Compris. Les classes déclarées dans les méthodes utilisent toujours des copies de variables."

"Exactement!"

"Alors, il est logique que les variables doivent être définitives. Et pourquoi elles ne peuvent pas être modifiées. Si vous travaillez réellement avec des copies plutôt qu'avec les originaux, l'utilisateur ne comprendra pas pourquoi il ne peut pas modifier les valeurs des variables, ce qui signifie que nous devons simplement lui interdire de les changer."

"Bien, déclarer des variables comme finales semble être un petit prix à payer en échange du fait que le compilateur génère une classe pour vous, la transmet à la méthode et enregistre toutes les variables de la méthode que vous souhaitez utiliser."

"Je suis d'accord. Les classes locales anonymes sont toujours super cool."

"Si je déclare une classe locale dans une méthode et que j'y utilise les variables de la méthode, le compilateur les ajoutera-t-il également à la classe?"

"Oui, il les ajoutera à la classe et à son constructeur."

"C'est ce que je pensais."