Ce se întâmplă cu adevărat (adică ce generează compilatorul din clase) - 1

"Bună, Amigo! Iată câteva informații suplimentare pentru tine."

„V-am spus deja că compilatorul convertește de fapt toate clasele anonime în clase interioare obișnuite.”

"Da. Îmi amintesc chiar că numele lor sunt numere: 1, 2, 3 etc."

— Exact. Dar mai e o nuanță aici.

„Dacă o clasă este declarată în interiorul unei metode și folosește oricare dintre variabilele sale, atunci referințele la acele variabile vor fi adăugate la clasa generată. Vedeți singur.”

„Începem cu asta:”

Înainte de compilare:
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;
 }
}

„Și compilatorul generează asta:

După compilare:
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;
  }
 }
}

"Ați înțeles ideea? Clasa interioară nu poate schimba variabila locală a metodei, deoarece până când codul clasei interioare este executat, este posibil să ieșim complet din metodă."

"Acum al doilea punct. Metoda toString() folosește o variabilă transmisă. Pentru a realiza acest lucru, a fost necesar să:"

A) salvați-l în clasa generată

B) adăugați-l la constructor.

"Am înțeles. Clasele declarate în cadrul metodelor folosesc întotdeauna copii ale variabilelor."

"Exact!"

„Atunci are sens de ce variabilele trebuie să fie finale. Și de ce nu pot fi modificate. Dacă de fapt lucrați cu copii și nu cu originale, utilizatorul nu va înțelege de ce nu poate schimba valorile variabilelor, ceea ce înseamnă că trebuie doar să-i interzicem să le schimbe.”

„Corect, declararea variabilelor ca fiind finale pare un preț mic de plătit în schimbul ca compilatorul să genereze o clasă pentru tine, să o transmită metodei și să salveze toate variabilele metodei pe care vrei să le folosești.”

"Sunt de acord. Cursurile locale anonime sunt încă super cool."

„Dacă declar o clasă locală în interiorul unei metode și folosesc variabilele metodei în ea, le va adăuga și compilatorul în clasă?”

„Da, le va adăuga la clasă și la constructorul acesteia”.

"Asta am crezut și eu."