
"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:"
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:
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."