Lớp ẩn danh Java rất giống với đóng Javascript, nhưng Java thực hiện điều đó theo cách khác. (kiểm tra câu trả lời của Andersen)
Vì vậy, để không nhầm lẫn Nhà phát triển Java với hành vi lạ có thể xảy ra đối với những người đến từ nền Javascript. Tôi đoán đó là lý do tại sao họ buộc chúng tôi sử dụngfinal
, đây không phải là giới hạn của JVM.
Hãy xem ví dụ Javascript dưới đây:
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
Trong Javascript, counter
giá trị sẽ là 100, vì chỉ có mộtcounter
biến từ đầu đến cuối.
Nhưng trong Java, nếu không có final
, nó sẽ in ra 0
, bởi vì trong khi đối tượng bên trong đang được tạo, 0
giá trị được sao chép vào các thuộc tính ẩn của đối tượng lớp bên trong. (có hai biến số nguyên ở đây, một biến trong phương thức cục bộ, một biến khác trong các thuộc tính ẩn của lớp bên trong)
Vì vậy, bất kỳ thay đổi nào sau khi tạo đối tượng bên trong (như dòng 1), nó sẽ không ảnh hưởng đến đối tượng bên trong. Vì vậy, nó sẽ làm cho sự nhầm lẫn giữa hai kết quả và hành vi khác nhau (giữa Java và Javascript).
Tôi tin rằng đó là lý do tại sao, Java quyết định buộc nó là cuối cùng, vì vậy dữ liệu là 'nhất quán' từ đầu đến cuối.