Kelas anonim Java sangat mirip dengan penutupan Javascript, tetapi Java mengimplementasikannya dengan cara yang berbeda. (periksa jawaban Andersen)
Jadi, agar tidak membingungkan Pengembang Java dengan perilaku aneh yang mungkin terjadi bagi mereka yang berasal dari latar belakang Javascript. Saya kira itu sebabnya mereka memaksa kami untuk menggunakan final
, ini bukan batasan JVM.
Mari kita lihat contoh Javascript di bawah ini:
var add = (function () {
var counter = 0;
var func = function () {
console.log("counter now = " + counter);
counter += 1;
};
counter = 100; // line 1, this one need to be final in Java
return func;
})();
add(); // this will print out 100 in Javascript but 0 in Java
Dalam Javascript, counter
nilainya akan menjadi 100, karena hanya ada satu counter
variabel dari awal hingga akhir.
Tetapi di Jawa, jika tidak ada final
, itu akan dicetak 0
, karena ketika objek batin sedang dibuat, 0
nilainya disalin ke properti tersembunyi objek kelas dalam itu. (ada dua variabel integer di sini, satu di metode lokal, satu lagi di properti tersembunyi kelas dalam)
Jadi setiap perubahan setelah pembuatan objek dalam (seperti baris 1), itu tidak akan mempengaruhi objek dalam. Jadi itu akan membuat kebingungan antara dua hasil dan perilaku yang berbeda (antara Java dan Javascript).
Saya percaya itu sebabnya, Jawa memutuskan untuk memaksanya menjadi final, sehingga datanya 'konsisten' dari awal hingga akhir.