दिलचस्प पोस्ट
किसी फ़ोल्डर में सभी फ़ाइलों के फ़ाइल नाम प्राप्त करना क्या किसी को ड्रैग एंड ड्रॉप, पुन: क्रम-योग्य सूची के निम्न स्तर (कोई फ्रेमवर्क) का पता नहीं है? हैशमैप से सम्मिलन आदेश से प्राप्त किए गए मानों का क्रम क्या है? कैसे जादूगर के साथ https को पकड़े, जावा में क्रोम में बुनियादी प्रमाणीकरण विवरण कैसे साफ़ करें जब मुझे कक्षा में स्थिर तरीके का उपयोग करना चाहिए और लाभ क्या हैं? JavaScript में अग्रणी शून्य के साथ एक संख्या पैड जावा का उपयोग कर सेलेनियम वेबड्राइवर में एक ड्रॉपडाउन मूल्य का चयन कैसे करें यूआरएल को लिंक्स में कन्वर्ट करने के लिए एक अच्छा रेगेक्स की आवश्यकता है, लेकिन अकेले मौजूदा लिंक को छोड़ दें Vtable के लिए अपरिभाषित संदर्भ क्यूटी प्रोजेक्ट को संकलित करने की कोशिश कर रहा है कैसे mockito साथ शून्य तरीकों से नकली बनाने के लिए एक हैश के लिए नमक छिपाने की आवश्यकता मैं तय / जमे हुए बाएं स्तंभ और स्क्रॉल करने वाला शरीर के साथ एक HTML तालिका कैसे बनाऊं? गैर-श्रेणी के गुणों में हमेशा सीवी-अयोग्य प्रकार होते हैं JSF 1.2 में EL द्वारा मापदंडों के साथ तरीकों को शामिल करना

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

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

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

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