Mi történik valójában (azaz mit generál a fordító az osztályokból) - 1

"Szia, Amigo! Itt van még néhány információ."

"Már mondtam neked, hogy a fordító tulajdonképpen minden anonim osztályt közönséges belső osztályokká alakít át."

"Igen. Még arra is emlékszem, hogy a nevük számok: 1, 2, 3 stb."

– Pontosan. De van itt egy másik árnyalat is.

"Ha egy osztály deklarálva van egy metóduson belül, és annak bármely változóját használja, akkor az ezekre a változókra való hivatkozások hozzáadódnak a generált osztályhoz. Nézd meg magad."

"Ezzel kezdjük:"

Összeállítás előtt:
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;
 }
}

"És a fordító ezt generálja:

Összeállítás után:
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;
  }
 }
}

"Érted a lényeget? A belső osztály nem tudja megváltoztatni a metódus helyi változóját, mert mire a belső osztály kódja lefut, lehet, hogy teljesen kilépünk a metódusból."

"Most a második pont. A toString() metódus egy átadott változót használ. Ennek megvalósításához a következőkre volt szükség:"

A) mentse el a generált osztályba

B) add hozzá a konstruktorhoz.

"Értem. A metódusokon belül deklarált osztályok mindig a változók másolatait használják."

"Pontosan!"

"Akkor érthető, hogy a változóknak miért kell véglegesnek lenniük. És miért nem lehet őket megváltoztatni. Ha valójában másolatokkal dolgozik, nem pedig az eredetivel, akkor a felhasználó nem fogja megérteni, miért nem tudja megváltoztatni a változók értékeit, azt jelenti, hogy meg kell tiltanunk neki, hogy megváltoztassa őket."

"Helyes, a változók véglegesnek nyilvánítása csekély árnak tűnik azért cserébe, ha a fordító létrehoz egy osztályt, átadja a metódusnak, és elmenti a metódus összes használni kívánt változóját."

"Egyetértek. Az anonim helyi osztályok még mindig nagyon menők."

"Ha deklarálok egy lokális osztályt egy metóduson belül, és a metódus változóit használom benne, akkor a fordító ezeket is hozzáadja az osztályhoz?"

"Igen, hozzáadja őket az osztályhoz és a konstruktorhoz."

"Ez az, amit gondoltam."