Vad händer egentligen (dvs vad kompilatorn genererar från klasser) - 1

"Hej Amigo! Här är lite mer information till dig."

"Jag har redan sagt att kompilatorn faktiskt omvandlar alla anonyma klasser till vanliga inre klasser."

"Japp. Jag kommer till och med ihåg att deras namn är siffror: 1, 2, 3, etc."

"Precis. Men det finns en annan nyans här."

"Om en klass deklareras inuti en metod och använder någon av dess variabler, kommer referenser till dessa variabler att läggas till i den genererade klassen. Se själv."

"Vi börjar med detta:"

Innan du kompilerar:
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;
 }
}

"Och kompilatorn genererar detta:

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örstod du poängen? Den inre klassen kan inte ändra metodens lokala variabel, för när den inre klassens kod exekveras kan vi gå ur metoden helt."

"Nu den andra punkten. Metoden toString() använder en överförd variabel. För att åstadkomma detta var det nödvändigt att:"

A) spara den i den genererade klassen

B) lägg till det i konstruktorn.

"Förstår. Klasser som deklareras i metoder använder alltid kopior av variabler."

"Exakt!"

"Då är det vettigt varför variabler måste vara slutgiltiga. Och varför de inte kan ändras. Om du faktiskt arbetar med kopior snarare än originalen, kommer användaren inte att förstå varför han inte kan ändra variablernas värden, vilket betyder att vi bara måste förbjuda honom att ändra dem."

"Just, att förklara variabler som slutgiltiga verkar vara ett litet pris att betala i utbyte mot att kompilatorn genererar en klass åt dig, skickar den till metoden och sparar alla metodens variabler som du vill använda."

"Jag håller med. Anonyma lokala klasser är fortfarande supercoola."

"Om jag deklarerar en lokal klass i en metod, och jag använder metodens variabler i den, kommer kompilatorn att lägga till dem i klassen också?"

"Ja, det kommer att lägga till dem i klassen och dess konstruktör."

"Det är det jag trodde."