दिलचस्प पोस्ट
Java.awt.Component.getName () और setName () के लिए क्या प्रयोग किया जाता है? मैं तारों से एक स्ट्रिंग कैसे विभाजित कर सकता हूं और सीमांकक को .NET का उपयोग कर सकता हूं? जावा में XML के लिए पाठ डेटा को एन्कोड करने का सर्वोत्तम तरीका? LINQ रिकर्सन फ़ंक्शन? जब `जीआईटी पुल – रिबेस 'मुझे परेशानी में लेटेगा? मैं सी # में एक tuple serialize क्यों नहीं कर सकता? क्या आपको कभी भी 'जावास्क्रिप्ट:' को ऑनक्लिक में निर्दिष्ट करने की ज़रूरत है? क्या मैं Visual Studio 2008 में .NET 4.0 बीटा का उपयोग कर सकता हूं? संदर्भ C ++ में क्यों नहीं reseatable हैं पता लगाएँ कि किस शाखा को एक स्थानीय शाखा ट्रैकिंग कर रही है एंड्रॉइड में टेक्स्ट की लंबाई को सीमित करें यह जांचने के लिए जावास्क्रिप्ट है कि क्या चेकबॉक्स को चेक या अनचेक किया जा रहा है या नहीं मेवेन और सिस्टम स्कोप में जार जोड़ना PHP के साथ JSON को पार्स करना स्थानीय JSON फ़ाइल लोड हो रही है

क्यों जावा इनर क्लास को "अंतिम" बाहरी इंस्टेंस चर की आवश्यकता होती है?

final JTextField jtfContent = new JTextField(); btnOK.addActionListener(new java.awt.event.ActionListener(){ public void actionPerformed(java.awt.event.ActionEvent event){ jtfContent.setText("I am OK"); } } ); 

अगर मैं final नहीं छोड़ूं , तो मुझे त्रुटि दिखाई देती है " एक अलग-अलग विधि में परिभाषित आंतरिक श्रेणी के अंदर एक गैर-अंतिम चर jtfContent का उल्लेख नहीं कर सकता "।

एक अनाम इनर क्लास को बाहरी क्लासेस इंस्टेंस चर की आवश्यकता क्यों होती है ताकि इसे एक्सेस करने के लिए अंतिम हो?

वेब के समाधान से एकत्रित समाधान "क्यों जावा इनर क्लास को "अंतिम" बाहरी इंस्टेंस चर की आवश्यकता होती है?"

सबसे पहले, चलो सब आराम करो, और उस बंदूक नीचे डाल कृपया।

ठीक। अब कारण यह है कि भाषा उस पर जोर देती है कि यह आपके आंतरिक कक्षा कार्यों को उन स्थानीय चर तक पहुंचने के लिए धोखा देती है, जो वे चाहते हैं। रनटाइम स्थानीय निष्पादन संदर्भ (और आदि जैसे उपयुक्त) की एक प्रतिलिपि बनाता है, और इस प्रकार यह आग्रह करता है कि आप सभी को final बनाते हैं ताकि चीजें ईमानदार रख सकें।

अगर ऐसा नहीं किया है, तो कोड जो आपके ऑब्जेक्ट के निर्माण के बाद एक स्थानीय चर के मान को बदलता है, लेकिन आंतरिक कक्षा फ़ंक्शन चलाने से पहले भ्रमित और अजीब हो सकता है।

यह जावा के आसपास बहुत सारे बौछा और "क्लोजर" का सार है।


नोट: ओपी के मूल रचना में कुछ अखिल कैप्स टेक्स्ट के संदर्भ में उद्घाटन अनुच्छेद एक मजाक था।

अज्ञात वर्ग के तरीकों में वास्तव में स्थानीय चर और विधि पैरामीटर तक पहुंच नहीं है। बल्कि, जब अज्ञात वर्ग का एक ऑब्जेक्ट तत्काल होता है, तो अंतिम स्थानीय चर और विधि पैरामीटर की प्रतियां ऑब्जेक्ट के तरीकों से संदर्भित होती हैं, ऑब्जेक्ट में इंस्टेंस चर के रूप में संग्रहीत होती हैं। गुमनाम वर्ग के ऑब्जेक्ट में तरीके वास्तव में उन छिपे हुए उदाहरण चर का उपयोग करते हैं [1]

इस प्रकार, लोकल क्लास के तरीकों के द्वारा उपयोग किए जाने वाले स्थानीय चर और विधि पैरामीटर को अंतिम रूप घोषित किया जाना चाहिए ताकि ऑब्जेक्ट को तत्काल के बाद बदलने से उनके मूल्यों को बदलने से रोक दिया जा सके।

[1] http://www.developer.com/java/other/article.php/3300881/The-Essence-of-OOP-using-Java-Anonymous-Classes.htm

चूंकि जावा 8 फ़ाइनल मॉडिफ़र बाह्य आवृत्ति चर के लिए वैकल्पिक है। मूल्य 'प्रभावी रूप से अंतिम' होना चाहिए जवाब अंतिम और प्रभावी अंतिम रूप में अंतर देखें।

इसका कारण यह है कि जावा पूरी तरह से तथाकथित "क्लोज़र्स" का समर्थन नहीं करता है – इस मामले में final आवश्यकता नहीं होगी – लेकिन बजाय कलेक्टर को कुछ छिपे हुए चर उत्पन्न करने के कारण एक चाल पाई है जो कि आपको दिखाई देने वाली कार्यक्षमता देने के लिए उपयोग की जाती है।

यदि आप उत्पन्न बाइट कोड को अलग करते हैं, तो आप देख सकते हैं कि कंपाइलर कैसे करता है, जिसमें अजीब नामित छिपे हुए चर को अंतिम चर की प्रतियां शामिल हैं।

ऐसा करने के लिए पीछे की भाषा झुकने के बिना कार्यक्षमता देने के लिए यह एक शानदार समाधान है।


संपादित करें: जावा 8 लैंबदास के लिए जो पहले अज्ञात कक्षाओं के साथ किया गया था, उसे करने के लिए एक अधिक संक्षिप्त तरीका प्रदान करते हैं। चर पर प्रतिबंध भी "अंतिम से" अनिवार्य रूप से अंतिम रूप से ढीला हुआ है – आपको इसे अंतिम घोषित करने की ज़रूरत नहीं है, लेकिन अगर ऐसा माना जाता है जैसे कि यह अंतिम है (आप अंतिम कीवर्ड जोड़ सकते हैं और आपका कोड अभी भी संकलित होगा) इस्तेमाल किया जा सकता है। यह वास्तव में अच्छा बदलाव है

कक्षा की परिभाषा के चारों ओर चर स्टैक पर रहते हैं, इसलिए वे संभवत: तब चले गए हैं जब अंदरूनी कक्षा के भीतर का कोड चलता है (यदि आप जानना चाहते हैं कि खोज स्टैक और ढेर क्यों है)। यही कारण है कि अंदरूनी कक्षाएं वास्तव में विधि में वेरिएबल्स का उपयोग नहीं करती हैं, लेकिन उन की प्रतियों से बनाई गई हैं

इसका मतलब यह है कि यदि आप आंतरिक वर्ग के निर्माण के बाद वाले विधि में वैरिएबल को बदलते हैं, तो इसका मान आंतरिक वर्ग में नहीं बदलेगा, भले ही आप इसे उम्मीद कर रहे हों वहाँ भ्रम को रोकने के लिए, जावा के लिए उन्हें अंतिम होना आवश्यक है, इसलिए आप उन्हें संशोधित करने में सक्षम नहीं होने की उम्मीद करते हैं।