2013-08-14 1 views
31

में अंतिम स्थानीय चर का उपयोग मैं सोच रहा था कि अंतिम स्थानीय चर का उपयोग करने की कोई उपयोगिता है। विरासत तस्वीर में आने पर वैरिएबल ओवरराइड नहीं होते हैं। उदाहरण के लिए एक सरल कोड के रूप में नीचेजावा

public static void main(String args[]) { 
    final String data = "Hello World!"; 
    System.out.println(data); 
} 

उदाहरण काफी सरल है और एक प्रासंगिक कोड नहीं हो सकता है लेकिन सवाल अधिक generic.I कोड का एक बहुत (मुख्य कार्य जो अंतिम राशि में सभी शामिल देखा है स्थानीय चर) क्या स्थानीय वैरिएबल को अंतिम के रूप में घोषित करने की कोई उपयोगिता है, इसके अलावा उन्हें उसी कार्य में संपादित नहीं किया जा सकता है?

+0

आपको इसकी आवश्यकता क्यों होगी? आप इसे हार्ड कोडेड या कक्षा –

उत्तर

57

सबसे पहले, "ओवरराइड" होने वाले चर के बारे में हिस्सा - final में दो बहुत अलग अर्थ हैं। कक्षाओं और विधियों के लिए, यह विरासत के बारे में है; चर के लिए यह केवल पढ़ने के बारे में है।

अंतिम स्थानीय चर के एक महत्वपूर्ण "विशेषता" है: इन्हें स्थानीय (आमतौर पर अज्ञात) आंतरिक कक्षाओं में उपयोग किया जा सकता है। गैर-अंतिम स्थानीय चर नहीं हो सकते हैं। मेरे अनुभव में, स्थानीय चर के लिए final का प्राथमिक उपयोग है।

public void foo() { 
    final String x = "hello"; 
    String y = "there"; 

    Runnable runnable = new Runnable() { 
     @Override public void run() { 
      System.out.println(x); // This is valid 
      System.out.println(y); // This is not 
     } 
    }; 
    runnable.run(); 
} 

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

+0

में एक निजी फाइनल का उपयोग कर सकते हैं, मुझे यह भी लगता है कि यह अनुकूलन करने में मदद करता है। इस अंतिम चर के परिवर्तन के रूप में नहीं, JVM प्रदर्शन को बेहतर बनाने के लिए इस चर के मान को कैश करेगा। –

+9

@ अंकुर जो लंबे समय तक नहीं रहे हैं। एक चर बदल गया है या नहीं और तदनुसार अनुकूलन अगर संकलक बहुत आसानी से काम कर सकते हैं। यहां [एक और SO उत्तर] है (http://stackoverflow.com/a/4279442/2071828) उस प्रभाव के लिए। –

+2

@ जोन स्कीट यह मानना ​​सही है कि ये परिवर्तनीय अपने स्थानीय दायरे से परे रहते हैं क्योंकि उन्हें अज्ञात आंतरिक कक्षाओं तक पहुंचा जा सकता है? – Ahmed

9

अंतिम स्थानीय चर को अज्ञात आंतरिक उप-वर्गों से एक्सेस किया जा सकता है, जबकि गैर अंतिम स्थानीय चर नहीं हो सकते हैं।

5

हाँ, वहाँ एक छोटा सा expample जहां हम आम तौर पर इसका इस्तेमाल कर सकते हैं -

स्निपेट:

final Boolean data = Boolean.TRUE; 
button.addListener(SWT.Selection, new Listener() { 
    public void handleEvent(Event event) { 
     if (data) { 
        .... 
       } 
     } 
}); 

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

8

हां, प्रयोज्यता है: - स्थानीय अंतिम चर विधि आंतरिक कक्षा द्वारा पहुंचा जा सकता है। चूंकि स्थानीय चर ढेर पर रहते हैं और केवल विधि के जीवनकाल के लिए मौजूद होते हैं लेकिन इनर क्लास ऑब्जेक्ट लंबे समय तक जीवित रह सकता है, इसलिए आंतरिक कक्षा किसी भी गैर-स्थानीय स्थानीय चर तक नहीं पहुंच सकती है। लेकिन एक बार परिवर्तक अंतिम होता है तो आंतरिक वर्ग सुनिश्चित करता है कि मान नहीं बदलेगा, इसलिए यह उपयोग के लिए अंतिम स्थानीय चर की एक निजी प्रतिलिपि रखेगा।

+0

यह एकमात्र उत्तर है जो मुझे कुछ उचित रूप से उपयुक्त पाया गया .. अच्छा एक @ कृष्णा – DJphy

3

आप पठनीयता के लिए final कीवर्ड का उपयोग करें और यहां की तरह सुनिश्चित इसे संशोधित नहीं कर रहा है या में गुमनाम कक्षाएं हो सकता है:

final String s = "hi"; 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      // can use s variable here 
     } 
    }).start(); 
3

यह बताता अन्य प्रोग्रामर कि जो कोई भी लिखा था यह जानता था कि डेटा shouldn 'का मान एक बार असाइन किया गया परिवर्तन। यह मेरी राय में एक अच्छी आदत है विशेष रूप से पैरामीटर चर को अंतिम के रूप में घोषित करना।

5

बिल्कुल सही जवाब जॉन स्कीट लेकिन अंतिम चर के दूसरे (छोटे) लाभ हैं।

संकलक यह सुनिश्चित करेगा कि अंतिम चर एक बार और केवल एक बार सेट हो।

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

जैसा कि मैंने कहा, थोड़ा लाभ लेकिन अभी भी आसान है। जावा में अंतिम स्थानीय चर का

4

उपयोग

final क्षेत्रों, मानकों, और स्थानीय चर केवल पढ़ने के लिए (वस्तु की पहचान, नहीं अपने राज्य का मतलब है) कर रहे हैं।

+0

निश्चित रूप से, लेकिन इसके नमक के किसी भी कंपाइलर को यह पता चलेगा कि चर कभी भी विधि के अंदर नहीं बदलता है, और इसे ठीक उसी तरह व्यवहार करता है जैसा कि यह किया गया था अंतिम घोषित केवल फायदे हैं: कोड पढ़ने या संशोधित करने वाले व्यक्ति को लेखक के इरादे को पता चलेगा, और यह आपको गलती से मूल्य को फिर से असाइन करने से रोकता है। –