2011-11-29 18 views
28

संभव डुप्लिकेट:
Why would one mark local variables and method parameters as “final” in Java?जावा में तरीकों में अंतिम चर

मैं कुछ जावा कोड की जाँच की गई थी, मैं कम से कम कुछ ज्ञान क्या अंतिम जैसे करता है जावा में अच्छा नहीं कर रहा हूँ सील कक्षाएं, केवल पढ़ने के लिए क्षेत्रों और गैर overridable तरीकों लेकिन यह मुझे अजीब लग रहा है, तरीकों में एक चर final की घोषणा:

private static void queryGoogleBooks(JsonFactory jsonFactory, String query) throws Exception { 
    // Set up Books client. 
    final Books books = Books.builder(new NetHttpTransport(), jsonFactory) 
     .setApplicationName("Google-BooksSample/1.0") 
     .setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() { 
      @Override 
      public void initialize(JsonHttpRequest request) { 
      BooksRequest booksRequest = (BooksRequest) request; 
      booksRequest.setKey(ClientCredentials.KEY); 
      } 
     }) 
     .build(); 

क्या आप मुझे बता सकते हैं कि final का अर्थ इस संदर्भ में क्या है?

http://code.google.com/p/google-api-java-client/source/browse/books-cmdline-sample/src/main/java/com/google/api/services/samples/books/cmdline/BooksSample.java?repo=samples

उत्तर

31

यह बस स्थानीय चर books अपरिवर्तनीय बनाता है:

यहाँ पूरा कोड है। इसका मतलब है कि यह हमेशा उसी Book ऑब्जेक्ट का निर्माण और निर्माण का संदर्भ होगा, और किसी अन्य ऑब्जेक्ट या शून्य के संदर्भ में बदला नहीं जा सकता है।

Book ऑब्जेक्ट स्वयं भी उत्परिवर्तनीय है क्योंकि एक्सेसर कॉल के अनुक्रम से देखा जा सकता है। केवल इसका संदर्भ नहीं है।

+1

इसके लायक कुछ भी नहीं है कि वस्तु बुक्स द्वारा की ओर इशारा किया * * परिवर्तनशील है है? –

+1

@ डॉउग: हाँ - मैंने अभी इसे अपने उत्तर में जोड़ा है। धन्यवाद। – BoltClock

+0

+1 तब (तालाब में एक बूंद हालांकि ..) –

1

मुझे पूरा यकीन है कि इसका मतलब है कि पुस्तकें से अधिक कुछ भी विधि में ओवरराइट नहीं किया जा सकता है।

3

इसी प्रकार वेरिएबल संदर्भ केवल पढ़ने के लिए बनाता है। आम तौर पर, यह कोड को गलती से एक चर को संशोधित करने से बचाने के लिए है जो परिवर्तित नहीं होना चाहिए।

+0

'अंतिम' इस संदर्भ में अधिक मतलब है। इस संदर्भ में –

9

इस मामले में, final Books books का अर्थ है कि books को एक बार एक मूल्य आवंटित किया जाना चाहिए।

मैं final कीवर्ड इस प्रकार का उपयोग करने के रूप में यह चर, जो मैं जब कोड को देख के रूप में यह स्थिति से अभी तक एक और चर को हटा बहुमूल्य जानकारी होने के लिए लगता है के इरादे से पता चलता है ... इसलिए बात करना चाहते।

यदि मैं final के रूप में एक चर को चिह्नित करता हूं तो यह मेरी आंख को बनाए रखने के लिए कुछ है क्योंकि यह कुछ समय जल्द ही मूल्यों को बदलने जा रहा है। यह जानकारी उपयोगी है, उदाहरण के लिए, डीबगर में कोड के माध्यम से कदम या कोड के चारों ओर & रीफैक्टरिंग।

+0

'अंतिम' का अर्थ अधिक है। लिंक के लिए –

+0

+1, उत्कृष्ट समझाओ! – NguyenDat

1

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

Cannot refer to a non-final variable inside an inner class defined in a different method

+1

अज्ञात वर्ग में परिवर्तनीय पुस्तकों का कोई संदर्भ नहीं है। यदि ऐसा होता है तो एक संकलन त्रुटि होगी, क्योंकि वैरिएबल प्रारंभ होने से पहले अज्ञात वर्ग बनाया जा रहा है। –

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