Wat er echt gebeurt (dwz wat de compiler uit klassen genereert) - 1

"Hallo, Amigo! Hier is wat meer informatie voor jou."

"Ik heb je al verteld dat de compiler eigenlijk alle anonieme klassen omzet in gewone innerlijke klassen."

"Ja. Ik herinner me zelfs dat hun namen nummers zijn: 1, 2, 3, etc."

'Precies. Maar er is nog een andere nuance.'

"Als een klasse binnen een methode wordt gedeclareerd en een van zijn variabelen gebruikt, worden verwijzingen naar die variabelen toegevoegd aan de gegenereerde klasse. Kijk zelf maar."

"We beginnen hiermee:"

Voor het compileren:
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;
 }
}

"En de compiler genereert dit:

Na het samenstellen:
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;
  }
 }
}

"Begrijp je het punt? De innerlijke klasse kan de lokale variabele van de methode niet veranderen, want tegen de tijd dat de code van de innerlijke klasse wordt uitgevoerd, kunnen we de methode helemaal verlaten."

"Nu het tweede punt. De methode toString() gebruikt een doorgegeven variabele. Om dit te bereiken, was het nodig om:"

A) sla het op in de gegenereerde klasse

B) voeg het toe aan de constructor.

"Begrepen. Klassen die binnen methoden worden gedeclareerd, gebruiken altijd kopieën van variabelen."

"Precies!"

"Dan is het logisch waarom variabelen definitief moeten zijn. En waarom ze niet kunnen worden gewijzigd. Als je daadwerkelijk met kopieën werkt in plaats van met de originelen, zal de gebruiker niet begrijpen waarom hij de waarden van variabelen niet kan veranderen. betekent dat we hem gewoon moeten verbieden ze te veranderen."

"Juist, het declareren van variabelen als definitief lijkt een kleine prijs om te betalen in ruil voor het feit dat de compiler een klasse voor je genereert, deze doorgeeft aan de methode en alle variabelen van de methode opslaat die je wilt gebruiken."

"Ik ben het ermee eens. Anonieme lokale lessen zijn nog steeds super cool."

"Als ik een lokale klasse binnen een methode declareer en ik gebruik de variabelen van de methode erin, zal de compiler ze dan ook aan de klasse toevoegen?"

"Ja, het zal ze toevoegen aan de klasse en zijn constructor."

"Dat is wat ik dacht."