Hvad sker der virkelig (dvs. hvad compileren genererer fra klasser) - 1

"Hej, Amigo! Her er nogle flere oplysninger til dig."

"Jeg har allerede fortalt dig, at compileren faktisk konverterer alle anonyme klasser til almindelige indre klasser."

"Jep. Jeg kan endda huske, at deres navne er tal: 1, 2, 3 osv."

"Nøjagtig. Men der er en anden nuance her."

"Hvis en klasse er erklæret inde i en metode og bruger nogen af ​​dens variabler, så vil referencer til disse variable blive tilføjet til den genererede klasse. Se selv."

"Vi starter med dette:"

Før kompilering:
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;
 }
}

"Og compileren genererer dette:

Efter kompilering:
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;
  }
 }
}

"Få du fat i pointen? Den indre klasse kan ikke ændre metodens lokale variabel, for på det tidspunkt, hvor den indre klasses kode er eksekveret, kan vi være ved at forlade metoden helt."

"Nu det andet punkt. ToString()-metoden bruger en bestået variabel. For at opnå dette var det nødvendigt at:"

A) gem det inde i den genererede klasse

B) tilføj det til konstruktøren.

"Godt. Klasser erklæret inde i metoder bruger altid kopier af variabler."

"Nemlig!"

"Så giver det mening, hvorfor variabler skal være endelige. Og hvorfor de ikke kan ændres. Hvis du rent faktisk arbejder med kopier frem for originalerne, vil brugeren ikke forstå, hvorfor han ikke kan ændre variables værdier, hvilket betyder, at vi bare skal forbyde ham at ændre dem."

"Godt, at erklære variabler som endelige synes at være en lille pris at betale i bytte for at få compileren til at generere en klasse for dig, videregive den til metoden og gemme alle metodens variabler, som du vil bruge."

"Jeg er enig. Anonyme lokale klasser er stadig super fede."

"Hvis jeg erklærer en lokal klasse inde i en metode, og jeg bruger metodens variabler i den, vil compileren så også tilføje dem til klassen?"

"Ja, det vil tilføje dem til klassen og dens konstruktør."

"Det var hvad jeg tænkte."