Hva skjer egentlig (dvs. hva kompilatoren genererer fra klasser) - 1

"Hei, Amigo! Her er litt mer informasjon til deg."

"Jeg har allerede fortalt deg at kompilatoren faktisk konverterer alle anonyme klasser til vanlige indre klasser."

"Jepp. Jeg husker til og med at navnene deres er tall: 1, 2, 3 osv."

"Akkurat. Men det er en annen nyanse her."

"Hvis en klasse er deklarert inne i en metode og bruker noen av dens variabler, vil referanser til disse variablene bli lagt til den genererte klassen. 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 kompilatoren genererer dette:

Etter 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;
  }
 }
}

"Fikk du poenget? Den indre klassen kan ikke endre metodens lokale variabel, fordi innen den indre klassens kode blir utført, kan vi gå ut av metoden helt."

"Nå det andre punktet. ToString()-metoden bruker en bestått variabel. For å oppnå dette var det nødvendig å:"

A) lagre den inne i den genererte klassen

B) legg den til konstruktøren.

"Skjønner det. Klasser deklarert i metoder bruker alltid kopier av variabler."

"Nøyaktig!"

"Da er det fornuftig hvorfor variabler må være endelige. Og hvorfor de ikke kan endres. Hvis du faktisk jobber med kopier i stedet for originalene, vil ikke brukeren forstå hvorfor han ikke kan endre variablenes verdier, som betyr at vi bare må forby ham fra å endre dem."

"Akkurat, å erklære variabler som endelige virker som en liten pris å betale i bytte for at kompilatoren genererer en klasse for deg, sender den til metoden og lagrer alle metodens variabler som du vil bruke."

"Jeg er enig. Anonyme lokale klasser er fortsatt superkule."

"Hvis jeg erklærer en lokal klasse inne i en metode, og jeg bruker metodens variabler i den, vil kompilatoren legge dem til klassen også?"

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

"Det er hva jeg trodde."