คลาสที่ไม่ระบุชื่อของ Java นั้นคล้ายกับการปิด Javascript แต่ Java นั้นนำไปใช้ในวิธีที่ต่างกัน (ตรวจสอบคำตอบของ Andersen)
ดังนั้นเพื่อไม่ให้นักพัฒนา Java สับสนกับพฤติกรรมแปลก ๆ ที่อาจเกิดขึ้นสำหรับผู้ที่มาจากพื้นหลัง Javascript ฉันเดาว่านั่นเป็นเหตุผลที่พวกเขาบังคับให้เราใช้final
นี่ไม่ใช่ข้อ จำกัด JVM
ลองดูตัวอย่าง Javascript ด้านล่าง:
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
ใน Javascript counter
ค่าจะเป็น 100 เนื่องจากมีเพียงcounter
ตัวแปรเดียวตั้งแต่ต้นจนจบ
แต่ใน Java หากไม่มีfinal
จะพิมพ์ออกมา0
เพราะในขณะที่วัตถุภายในกำลังสร้างขึ้น0
ค่าจะถูกคัดลอกไปยังคุณสมบัติที่ซ่อนของวัตถุชั้นใน (มีตัวแปรจำนวนเต็มสองตัวที่นี่หนึ่งตัวในวิธีโลคัลอีกตัวหนึ่งในคุณสมบัติซ่อนเร้นชั้นใน)
ดังนั้นการเปลี่ยนแปลงใด ๆ หลังจากการสร้างวัตถุภายใน (เช่นบรรทัดที่ 1) มันจะไม่ส่งผลกระทบต่อวัตถุภายใน ดังนั้นจะสร้างความสับสนระหว่างผลลัพธ์และพฤติกรรมที่แตกต่างกันสองรายการ (ระหว่าง Java และ Javascript)
ฉันเชื่อว่าเป็นเหตุผลว่าทำไม Java ตัดสินใจที่จะบังคับให้เป็นที่สิ้นสุดดังนั้นข้อมูลจึง 'สอดคล้อง' ตั้งแต่ต้นจนจบ