2013-07-29 2 views
5

आज Google से कोड के एक निश्चित टुकड़े की खोज करते समय, मैं एक क्यू/ए ब्लॉग में आया, जहां कहा गया कि हम एक वर्ग के एक विधि के अंदर एक स्थानीय चर घोषित कर सकते हैं। हालांकि, लेखक ऐसा करने की आवश्यकता/लाभ की व्याख्या करने के लिए पर्याप्त अनिच्छुक थे।स्थानीय चर ने कक्षा के तरीके में अंतिम बनाया - लेकिन क्यों?

public class A 
{ 
private void show() 
{ 
    final String s="checking"; 
} 
} 

की तरह मैं इस पर मुझे शिक्षित करने के लिए जावा गुरुओं की मदद की कोशिश करेगी। आपके तरह के समर्थन और मार्गदर्शन के लिए अग्रिम धन्यवाद।

सर्वश्रेष्ठ संबंध!

+3

[जावा में लागू होने पर "अंतिम" संशोधक का उपयोग करके संभावित डुप्लिकेट] (http://stackoverflow.com/questions/137868/using-final-modifier- कभी भी- लागू-इन-जावा) –

उत्तर

8

अन्य उत्तर के अलावा, एक चर final बनाने की कक्षाएं और इंटरफेस की इनलाइन कार्यान्वयन में उस चर के उपयोग के लिए सक्षम बनाता है:

final String test = "test"; 

foo = new Foo() { 
     public void bar() { 
      System.out.println(test); 
     } 
    }; 

संपादित करें: आप अभी शुरुआत कर रहे हैं यह भी उनका कहना है लायक हो सकता है कि परिवर्तनीय वास्तव में संदर्भउदाहरण पर है। जब आप एक चर final बनाते हैं तो आप वास्तव में संदर्भ निरंतर बना रहे हैं, यानी, एक अंतिम चर प्रारंभिकरण के बाद कभी किसी अन्य उदाहरण को संदर्भित नहीं कर सकता है। इससे कोई दावा नहीं होता है कि वास्तविक संदर्भित उदाहरण स्थिर है या नहीं।

उदाहरण के लिए, अगर आप कहते हैं कि final String[] foo = { "bar", baz" } आप कर सकते हैं करते foo[0] = "sheep" भी foo हालांकि final है। आप क्या कर सकते हैं संदर्भ foo कुछ और करने के लिए परिवर्तनीय है, जैसे foo = new String[]... या foo = someOtherArray में। इसे उत्परिवर्तन और अपरिवर्तनीयता और उन अवधारणाओं को final के समान कुछ करना है, इसलिए वे कुछ जांच के लायक हो सकते हैं।

+0

महान उत्तर महोदय! बहुत बहुत धन्यवाद :) – animark

0

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


नहीं ऊपर एक final class है कि आप से विरासत नहीं कर सकते हैं के साथ मिश्रित किया जाना है।


more data could be found in wikipedia

+0

धन्यवाद सर! हां, मैं उस हिस्से को समझता हूं, लेकिन चूंकि वह चर उस वर्ग का सदस्य चर नहीं है, बल्कि उस विधि के लिए स्थानीय का दायरा था, तो विरासत संभवत: उस पर क्या प्रभाव ला सकता है? इसे अंतिम बनाने की क्या ज़रूरत थी ?? अगर मेरे प्रश्न आपको समझ में आता है तो मुझे बताएं। – animark

+0

'अंतिम' केवल विरासत के लिए नहीं है। जब आप एक var final घोषित करते हैं, तो इसका मतलब है कि आप इसे बदल नहीं सकते हैं। सी/सी ++ में 'const' की तरह। – elyashiv

4

चर केवल पढ़ने के लिए स्मृति में रखा जा सकता है, यह तेजी से पर संचालित करने के लिए बना रही है।

यह भी ऐसा करने के लिए तार्किक हो सकता है, उदाहरण के लिए स्थानीय स्थिरांक का प्रतिनिधित्व करने या यह सुनिश्चित करना कि एक निश्चित मूल्य गलती से नहीं बदला गया है। यह बग को कंपाइलर त्रुटियों में बदलने का एक उपयोगी तरीका बनाता है।

इसके अलावा, यह अन्य उत्तरों द्वारा इंगित किए गए वैरिएबल को आंतरिक/अज्ञात वर्गों के भीतर उपयोग करने की अनुमति देता है।

1

सभी चीजें हैं जो चाहिए नहीं परिवर्तन बस नीचे संभावनाओं को सीमित कर को जोड़ना final है कि आप (या अगले प्रोग्रामर, अपने कोड पर काम कर) नादुस्र्स्ती से समझना या विचार प्रक्रिया है जो आपके कोड में हुई दुरुपयोग होगा।

this answer से इसी तरह के प्रश्न में लिया गया।

4

वैरिएबल को इसके प्रारंभिकरण के बाद अपरिवर्तित रहने के लिए लागू करने के अलावा, final के रूप में एक चर घोषित करने से यह स्थानीय आंतरिक कक्षाओं के तरीके तक पहुंच योग्य हो जाता है।
में अधिक विस्तृत जानकारी कोड की निम्न छोटा सा टुकड़ा के लिए disassembled कोड को देखकर प्राप्त किया जा सकता:

J:\>javap -c MyFinal 
Compiled from "MyFinal.java" 
class MyFinal extends java.lang.Object{ 
MyFinal(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: ldc  #2; //String java 
    2: astore_1 
    3: return 

} 

मुख्य विधि में:

class MyFinal 
{ 
    public static void main(String[] args) 
    { 
     String str = "java"; 
     final String str1 = "Hello"; 
    } 
} 

उपरोक्त कार्यक्रम के लिए disassembled कोड इस प्रकार है उपरोक्त पृथक कोड के हम देखते हैं कि जावा कंपाइलर ने non-final परिवर्तनीय str के स्ट्रिंग ऑब्जेक्ट निर्माण के लिए कोड रखा है, लेकिन इसने final String str1 = "Hello"; के लिए स्ट्रिंग ऑब्जेक्ट सृजन कोड को चुपचाप छोड़ा है। ऐसा इसलिए है क्योंकि str1 विधि में कहीं भी उपयोग नहीं किया जाता है। इसलिए यह संकलक को कोड को अनुकूलित करने में मदद करता है, जो इसका उपयोग नहीं होने पर अनावश्यक ऑब्जेक्ट सृजन से बचने में मदद करता है।

2

यह आसानी से बताने में सक्षम होने के लिए समझ में आता है कि परिवर्तनीय नहीं बदलेगा। यदि यह एक आदिम है, तो आप मूल्य को अपरिवर्तनीय मान सकते हैं, और यदि यह नहीं है, तो अब आप जानते हैं कि मान हमेशा एक ही उदाहरण होगा (जिसे राज्य बदला जा सकता है)।

यह प्रोग्राम की पठनीयता के लिए उपयोगी है ताकि हम सुनिश्चित हों कि चर को कभी भी असाइन नहीं किया गया है। यह अज्ञात कार्यों के लिए भी उपयोगी है, यहां बताया गया है: Why do we use final keyword with anonymous inner classes?

संबंधित मुद्दे