जावा अनाम वर्ग जावास्क्रिप्ट बंद होने के समान है, लेकिन जावा इसे अलग तरीके से लागू करता है। (एंडरसन के जवाब की जाँच करें)
इसलिए जावा डेवलपर को अजीब व्यवहार के साथ भ्रमित न करने के लिए जो जावास्क्रिप्ट पृष्ठभूमि से आने वालों के लिए हो सकता है। मुझे लगता है कि इसीलिए वे हमें इस्तेमाल करने के लिए मजबूर करते हैंfinal
, यह जेवीएम सीमा नहीं है।
आइए नीचे दिए गए जावास्क्रिप्ट उदाहरण को देखें:
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
जावास्क्रिप्ट में, counter
मान 100 होगा, क्योंकि एक ही हैcounter
शुरुआत से अंत तक चर है।
लेकिन जावा में, यदि कोई नहीं है final
, तो यह प्रिंट आउट होगा 0
, क्योंकि जब आंतरिक ऑब्जेक्ट बनाया जा रहा है, तो 0
मूल्य को आंतरिक वर्ग ऑब्जेक्ट के छिपे हुए गुणों की नकल किया जाता है। (यहां दो पूर्णांक चर हैं, एक स्थानीय विधि में, दूसरा आंतरिक कक्षा में छिपा हुआ गुण है)
तो आंतरिक वस्तु निर्माण (जैसे पंक्ति 1) के बाद कोई भी परिवर्तन, यह आंतरिक वस्तु को प्रभावित नहीं करेगा। तो यह दो अलग-अलग परिणामों और व्यवहार (जावा और जावास्क्रिप्ट के बीच) के बीच भ्रम पैदा करेगा।
मेरा मानना है कि यही कारण है कि जावा इसे अंतिम रूप देने के लिए मजबूर करता है, इसलिए डेटा शुरुआत से अंत तक 'सुसंगत' है।