2010-02-19 15 views
6

मैं अभी कुछ कोड में आया हूं जो मुझे थोड़ा उलझन में डाल रहा है; वास्तव में 2 भिन्नताएं हैं जिन्हें मैं स्पष्ट करना चाहता हूं।क्या जावा में एक अंतिम अंतिम चर दूसरी तरफ अंतिम रहता है?

उदाहरण 1:

public String getFilepath(){ 
     final File file = new File(this.folder, this.filename); 
     return file.getAbsolutePath(); 
    } 

क्या file "final" घोषित करने के उद्देश्य हो सकता है? चूंकि जावा प्राइमेटिव मान द्वारा पारित किए जाते हैं, और getAbsolutePath() सिर्फ String लौटा रहा है, तो दूसरी तरफ (कॉलिंग विधि) चर final नहीं होगा, है ना? और चूंकि file चर केवल इन 2 लाइनों के दायरे में मौजूद है, इसलिए मैं वास्तव में final कीवर्ड का कोई उद्देश्य नहीं देख सकता। क्या मुझे कुछ याद आ रही है? कोई भी ऐसा करने का कारण देखता है?

उदाहरण 2:

public String getFilepath(){ 
     final File file = new File(this.folder, this.filename); 
     return file; 
    } 

यहाँ के बाद से वास्तविक वस्तु लौटे जा रहा है ... इसका मतलब यह file चर निरंतर हो जाएगा करता है/final दूसरे पक्ष पर ...? यह समझ में नहीं आता है।

सामान्यतः, मुझे लगता है कि आप एक चर, के बिना पहुंच प्रकार पास करते हैं। जैसा कि, public के साथ एक फ़ंक्शन में private वैरिएबल हो सकता है जो फ़ंक्शन देता है - लेकिन फ़ंक्शन को कॉल करके इसे प्राप्त करने वाले चर को एक एक्सेस संशोधक निर्दिष्ट करना होता है। तो यदि यह public निर्दिष्ट करता है, तो लौटा चर उस दायरे में public होगा। यदि यह private निर्दिष्ट करता है, तो उस दायरे में लौटा चर private होगा। final के साथ कोई अंतर है? एक परिवर्तनीय कुछ "स्थिरता" है जिसे पारित किया जा सकता है? जावा के बारे में मुझे क्या पता है, यह मुझे असंभव के रूप में मारता है।

या क्या मैं पूरी तरह से बिंदु खो रहा हूं और उपरोक्त कोड में final कीवर्ड का कोई अन्य उद्देश्य है?

संपादित करें:

मैं मूल डेवलपर जो कोड लिखा था के साथ वापस जाँच की, और उन्होंने कहा कि वह केवल में है क्योंकि वह मूल रूप से सोचा था विधि एक बहुत लंबे समय तक किया जाएगा final कीवर्ड डाल दिया और सुनिश्चित करना चाहते थे कि फाइल लगातार स्थिर रहे। उन्होंने यह भी कहा कि वह आम तौर पर वेरिएबल घोषित करते हैं जिन्हें final के रूप में नहीं बदला जाना चाहिए, बोर्ड के नियम के रूप में और सिद्धांत पर आधारित - एक बिंदु है कि नीचे दिए गए दोनों उत्तरों का उल्लेख किया गया है। तो ऐसा लगता है कि मैं मानक कारणों के लिए शामिल एक साधारण अतिरिक्त कीवर्ड में बहुत अधिक पढ़ रहा था। सबको धन्यवाद!

उत्तर

3

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

final कीवर्ड का प्राथमिक लाभ प्रोग्रामर के लिए यह इंगित करने के लिए है कि कक्षा, विधि या फ़ील्ड को बदला नहीं जाना चाहिए।

ध्यान रखें कि एक चर final घोषित करने से संदर्भित वस्तु अपरिवर्तनीय नहीं होती है। इसका मतलब यह है कि चर के पास इसका मूल्य पुन: असाइन नहीं किया जा सकता है। आप अभी भी वेरिएबल file के विधियों को चला सकते हैं जो आंतरिक रूप से File ऑब्जेक्ट को बदल सकते हैं।

आपके द्वारा दी जाने वाली दो विधियों में, मुझे file परिवर्तनीय final बनाने में कोई मूल्य नहीं दिखता है। कुछ कोड सम्मेलन वकील सभी परिवर्तनीय final बनाने के लिए जब तक संशोधित करने की आवश्यकता नहीं है। कुछ लोग उस पर सब्सक्राइब नहीं करते हैं। मैं इसे precautionary principle पर एक भिन्नता मानता हूं।

+0

ऐसे मामले हैं जहां अंतिम उपयोग करने से निश्चित रूप से आपको बेहतर प्रदर्शन मिल जाएगा, उदाहरण के लिए http://en.wikipedia.org/wiki/Memoization का उपयोग करना। – Stuart

+0

@ स्टुअर्ट, आप उलझन में हैं। ज्ञापन अनुकूलन 'अंतिम' कीवर्ड से संबंधित नहीं हैं (हालांकि वे जावा में संयोजन के रूप में उपयोग किए जा सकते हैं, 'अंतिम' कीवर्ड मेमोआज़ेशन पैटर्न के अंतर्निहित गति लाभ प्रदान नहीं करता है)। – BrainSlugs83

+0

ओपी का सवाल कभी जवाब नहीं दिया गया था। क्या एक p̶a̶s̶s̶e̶d̶ दूसरी तरफ जावा रहने के फाइनल में अंतिम चर लौटाता है? –

13

final इस मामले में इसका मतलब है कि स्थानीय संदर्भ file अपरिवर्तनीय होगा। इसका तरीका विधि के बाहर कोई मतलब नहीं है। कुछ कोडिंग सम्मेलन वकील को सभी चर अंतिम होते हैं जब तक कि उन्हें उत्परिवर्तनीय होने की आवश्यकता न हो, ताकि जब आप कोई ऐसे दिशानिर्देशों का पालन कर रहे हों तो आपको कोड दिखाई देगा।

+3

मुझे पता है कि यह नाइटपिकिंग है ... लेकिन मैं बस यह उल्लेख करना चाहता था कि "अपरिवर्तनीय" शायद सबसे अच्छा शब्द पसंद न हो, क्योंकि सभी स्ट्रिंग जावा में अपरिवर्तनीय हैं। मुझे आपकी बात मिलती है, हालांकि, – froadie

+5

पर ध्यान दिए बिना मैंने कहा कि _reference_ फ़ाइल अपरिवर्तनीय थी। अर्थात। आप 'फ़ाइल' को किसी अन्य 'फ़ाइल' ऑब्जेक्ट पर इंगित नहीं कर सके। जावा में 'अंतिम' कीवर्ड का अर्थ यही है। संदर्भ बदला नहीं जा सकता है। अपरिवर्तनीय शब्द का अर्थ केवल कुछ ऐसा है जिसे बदला नहीं जा सकता है। इसका उपयोग कई संदर्भों में किया जा सकता है। – Kris