2010-11-12 18 views
53

नीचे दिए गए कोड के बीच अंतिम अंतर क्या है। अंतिम रूप में तर्क घोषित करने में कोई फायदा है।अंतिम विधि के रूप में जावा विधि तर्क बनाना

public String changeTimezone(Timestamp stamp, Timezone fTz, Timezone toTz){ 
    return .... 
} 

public String changeTimezone(final Timestamp stamp, final Timezone fTz, 
     final Timezone toTz){ 
    return .... 
} 
+3

कोड विश्लेषक हैं जो चेतावनी देते हैं कि पैरामीटर का पुन: उपयोग या पुन: असाइन किया गया है या नहीं। (स्थानीय चर के लिए समान) IMHO, यदि आप उन्हें बदलते हैं तो यह पैरामीटर को पकड़ने का एक बेहतर तरीका है अवांछनीय है। –

+0

संभावित डुप्लिकेट [जावा में विधि पैरामीटर पर "अंतिम" कीवर्ड का उपयोग क्यों करना चाहिए?] (Https://stackoverflow.com/questions/500508/why-should-i-use-the-keyword-final-on -ए-विधि-पैरामीटर-इन-जावा) –

उत्तर

75

एक औपचारिक विधि पैरामीटर के रूप में एक स्थानीय चर है, तो आप उन्हें अंतिम अज्ञात कक्षाओं से ही एक्सेस कर सकते हैं अगर उन्हें अंतिम घोषित किया जाता है।

इस विधि शरीर में एक अन्य स्थानीय अंतिम चर घोषित करने से बचाता है:

void m(final int param) { 
     new Thread(new Runnable() { 
      public void run() { 
       System.err.println(param); 
      } 
     }).start(); 
    } 
+18

+1: यह एक महत्वपूर्ण उपयोग केस है, और एकमात्र समय जब आपको * इसकी आवश्यकता होती है। (बाकी समय यह प्रोग्रामर की मदद करने के लिए सुविधाजनक क्या है।) –

+3

क्या मैं इसके पीछे तर्क पूछ सकता हूं? – KodeWarrior

+11

जावा 8 के साथ और ज़रूरी नहीं है। –

10

इससे कोई फर्क नहीं पड़ता है। यह सिर्फ मतलब है कि आप नहीं लिख सकते हैं:

stamp = null; 
fTz = new ...; 

लेकिन आप अभी भी लिख सकते हैं:

stamp.setXXX(...); 
fTz.setXXX(...); 

यह मुख्य रूप से रखरखाव प्रोग्रामर है कि आप इस प्रकार है कि आप एक आवंटित करने के लिए नहीं जा रहे हैं करने के लिए एक संकेत है पैरामीटर के लिए नया मूल्य कहीं भी आपकी विधि के बीच में जहां यह स्पष्ट नहीं है और इसलिए भ्रम पैदा हो सकता है।

15

फाइनल आपको चर के लिए एक नया मान निर्धारित करने से रोकता है, और यह टाइपो को पकड़ने में सहायक हो सकता है। स्टाइलिस्टिक रूप से आप मानकों को अपरिवर्तित प्राप्त करना और स्थानीय चरों को असाइन करना चाहते हैं, इसलिए अंतिम उस शैली को लागू करने में मदद करेगा।

स्वीकार करना चाहिए कि मुझे शायद ही कभी पैरामीटर के लिए अंतिम उपयोग करना याद रखना चाहिए, शायद मुझे चाहिए।

public int example(final int basicRate){ 
    int discountRate; 

    discountRate = basicRate - 10; 
    // ... lots of code here 
    if (isGoldCustomer) { 
     basicRate--; // typo, we intended to say discountRate--, final catches this 
    } 
    // ... more code here 

    return discountRate; 
} 
0

यह जावा में सिर्फ एक निर्माण है जो आपको अनुबंध को परिभाषित करने में मदद करता है और इसके साथ चिपक जाता है। यहां एक समान चर्चा: http://c2.com/cgi/wiki?JavaFinalConsideredEvil

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

सबसे खराब मामले में, यदि आप तर्क संदर्भ को फिर से परिभाषित करते हैं, तो यह फ़ंक्शन को पारित वास्तविक मूल्य को प्रभावित नहीं करेगा - क्योंकि केवल एक संदर्भ पारित किया गया था।

2

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

+1

मुझे कुछ जोड़ना है: यदि पैरामीटर आदिम हैं, मुझे कोई अंतर नहीं दिख रहा है। इसके अलावा, यदि पैरामीटर संग्रह (ऑब्जेक्ट्स की एक सूची ...) हैं, तो अंतिम जोड़ना उन्हें संशोधित करने से नहीं रोक सकता है। – Sam003

+1

अपरिवर्तनीयता हमेशा एक वांछनीय विशेषता है। जावा में यह बॉक्स से बाहर नहीं है। कम से कम चर बनाने के लिए संदर्भ अखंडता सुनिश्चित करता है। – Sid

+0

मैं सहमत हूं। लेकिन अगर हम वास्तव में वस्तुओं के लिए अपरिवर्तनीयता प्राप्त करना चाहते हैं, तो हम एक गहरी क्लोन बनाने का प्रयास कर सकते हैं। – Sam003

19

से निकालें The final word on the final keyword

अंतिम पैरामीटर

निम्न नमूना अंतिम मापदंडों वाणी:

public void doSomething(final int i, final int j) 
{ 
    // cannot change the value of i or j here... 
    // any change would be visible only inside the method... 
} 

अंतिम यहाँ प्रयोग किया जाता है दो अनुक्रमित सुनिश्चित करने के लिए मैं और जी जीता ' गलती से विधि द्वारा रीसेट करें। के खिलाफ सुरक्षा के लिए यह एक आसान तरीका है जो आपके पैरामीटर के मान को गलती से बदलता है।आम तौर पर, छोटी विधियां त्रुटियों की इस श्रेणी से रक्षा करने का एक बेहतर तरीका है, लेकिन अंतिम पैरामीटर आपकी कोडिंग शैली के अतिरिक्त उपयोगी हो सकता है।

ध्यान दें कि अंतिम मापदंडों विधि हस्ताक्षर का माना हिस्सा नहीं हैं, और जब विधि कॉल को हल करने संकलक द्वारा नजरअंदाज कर दिया जाता है। पैरामीटर को अंतिम (या नहीं) घोषित किया जा सकता है, इस पर कोई प्रभाव नहीं है कि विधि ओवरराइड कैसे है।

+8

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

1

इस विधि final कीवर्ड तर्क संदर्भ पाएगा गलती से उन मामलों पर एक संकलन त्रुटि है पुनः नियुक्त होने के शरीर के लिए (सबसे IDEs सीधे शिकायत करेंगे)। कुछ लोग तर्क दे सकते हैं कि जब भी संभव हो तो final का उपयोग सामान्य रूप से चीजों को गति देगा लेकिन हाल ही में जेवीएम में यह मामला नहीं है।

0

मैं सामान्य रूप से चर और फ़ील्ड को अंतिम रूप देने के बारे में बात कर रहा हूं - केवल विधि तर्कों पर लागू नहीं होता है। (चिह्नित विधियों/कक्षाओं की अंतिम एक पूरी बात है)।

यह आपके कोड के पाठकों/भविष्य के रखरखाव करने वालों का पक्ष है। परिवर्तनीय के एक समझदार नाम के साथ, यह आपके कोड के पाठक को यह समझने और समझने के लिए आश्वस्त है कि प्रश्न में चर क्या दर्शाते हैं - और यह पाठक को आश्वस्त करता है कि जब भी आप एक ही दायरे में चर को देखते हैं, तो अर्थ रहता है वही, इसलिए उसे हमेशा अपने सिर को खरोंच नहीं करना पड़ता है ताकि यह पता चल सके कि हर संदर्भ में एक चर का अर्थ क्या है। हमने चर के "पुनः उपयोग" के बहुत से दुरुपयोग देखे हैं, जो समझने के लिए एक छोटा कोड स्निपेट भी कठिन बनाता है।

-3

अंतिम कीवर्ड आपको पैरामीटर के लिए एक नया मान निर्दिष्ट करने से रोकता है। मैं एक साधारण उदाहरण के साथ यह समझाने के लिए चाहते हैं

मान लीजिए हमारे पास एक विधि

Method1() {

दिनांक dateOfBirth = new Date ("1/1/2009");

method2 (dateOfBirth);

method3 (dateOfBirth); }

सार्वजनिक mehod2 (तिथि dateOfBirth) {
....
....
....
}

सार्वजनिक mehod2 (तिथि dateOfBirth) {
....
....
....
}

उपर्युक्त मामले में यदि "dateOfBirth" को विधि 2 में नया मान असाइन किया गया है तो इसके परिणामस्वरूप विधि 3 से गलत आउटपुट होगा। विधि 3 पर पारित होने वाला मान यह नहीं है कि यह विधि 2 में पारित होने से पहले क्या था। इसलिए इस अंतिम कीवर्ड से बचने के लिए पैरामीटर के लिए उपयोग किया जाता है।

और यह जावा कोडिंग बेस्ट प्रैक्टिस में से एक है।

+5

यह बिल्कुल सही नहीं है। भले ही तर्क दिनांकऑफबर्थ को विधि 2() में किसी अन्य मान में बदल दिया गया हो, यह विधि 2() पर कोई प्रभाव नहीं पड़ेगा, क्योंकि जावा मूल्य से गुजरता है और संदर्भ के अनुसार नहीं। – Flo

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