"Hai, Amigo! Ini beberapa informasi lagi untukmu."
"Saya sudah memberi tahu Anda bahwa kompiler benar-benar mengubah semua kelas anonim menjadi kelas dalam biasa."
"Ya. Aku bahkan ingat nama mereka adalah angka: 1, 2, 3, dst."
"Tepat. Tapi ada nuansa lain di sini."
"Jika sebuah kelas dideklarasikan di dalam sebuah metode dan menggunakan salah satu variabelnya, maka referensi ke variabel tersebut akan ditambahkan ke kelas yang dihasilkan. Lihat sendiri."
"Kita mulai dengan ini:"
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;
}
}
"Dan kompiler menghasilkan ini:
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;
}
}
}
"Apakah Anda mengerti maksudnya? Kelas dalam tidak dapat mengubah variabel lokal metode, karena pada saat kode kelas dalam dieksekusi, kita mungkin keluar dari metode sama sekali."
"Sekarang poin kedua. Metode toString() menggunakan variabel yang diteruskan. Untuk melakukannya, perlu:"
A) simpan di dalam kelas yang dihasilkan
B) menambahkannya ke konstruktor.
"Mengerti. Kelas yang dideklarasikan di dalam metode selalu menggunakan salinan variabel."
"Tepat!"
"Maka masuk akal mengapa variabel harus final. Dan mengapa mereka tidak dapat diubah. Jika Anda benar-benar bekerja dengan salinan daripada yang asli, pengguna tidak akan mengerti mengapa dia tidak dapat mengubah nilai variabel, yang mana berarti kita hanya perlu melarang dia untuk mengubahnya."
"Benar, mendeklarasikan variabel sebagai final tampaknya merupakan harga kecil yang harus dibayar sebagai imbalan karena kompiler membuat kelas untuk Anda, meneruskannya ke metode, dan menyimpan semua variabel metode yang ingin Anda gunakan."
"Aku setuju. Kelas lokal anonim masih sangat keren."
"Jika saya mendeklarasikan kelas lokal di dalam sebuah metode, dan saya menggunakan variabel metode di dalamnya, apakah kompiler akan menambahkannya ke kelas juga?"
"Ya, itu akan menambahkannya ke kelas dan konstruktornya."
"Itulah yang saya pikir."
GO TO FULL VERSION