2015-05-28 10 views
8

अब, मैंने हाल ही में एक सिफारिश में भाग लिया है कि आपको कीवर्ड अंतिम जितना संभव हो सके कीवर्ड का उपयोग करना चाहिए। प्रोग्रामर को अपने पैर को शूट करने से रोकने के लिए यह अच्छा है - यानी वेरिएबल को पुन: असाइन करें जिसे पुन: असाइन नहीं किया जाना चाहिए।क्या कीवर्ड फ़ाइनल का JVM पर कोई प्रभाव पड़ता है?

लेकिन, क्या यह किसी अन्य लक्ष्य की सेवा करता है? यही है, क्या JVM किसी भी तरह बाइटकोड को अनुकूलित करने के लिए अंतिम चर के बारे में जानकारी का उपयोग कर सकता है, इसलिए यह तेजी से भाग जाएगा (एक बेहतर पाइपलाइनिंग का निर्माण या बहुमत वाले वातावरण में इसका उपयोग करें)? या सिर्फ एक वाक्य रचनात्मक चीनी है जो कोड विकास के दौरान त्रुटियों की संभावना को कम करती है?

+0

अंतिम या आप कंपाइलर अनुकूलन में निरंतर सहायता कह सकते हैं। उदाहरण: - निरंतर फोल्डिंग, लगातार प्रचार –

+0

संबंधित: http://stackoverflow.com/questions/3961881/why-defining-class-as-final-improves-jvm-performance?rq=1 – Patrick

+0

"या सिर्फ एक वाक्य रचनात्मक चीनी है जो कोड विकास के दौरान त्रुटियों की संभावना को कम करता है? " वास्तविक बुद्धिमान विचार त्रुटियों को कम करता है। इसके बिना, अंतिम कीवर्ड न केवल वाक्य रचनात्मक चीनी बल्कि एक प्लेसबो भी है। – Gimby

उत्तर

4

IBM states:

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

4

जहां तक ​​चर चलते हैं, जावा यह समझने के लिए पर्याप्त स्मार्ट है कि विधि में कहीं भी एक चर नहीं बदला जा रहा है, और अनुकूलन उद्देश्यों के लिए इस ज्ञान का उपयोग करें। इसे जानने के लिए आपको एक चर final चिह्नित करने की आवश्यकता नहीं है।

तरीके एक अलग कहानी है: जब आप final विधि को चिह्नित करते हैं, तो जावा इस तरह की विधि को तेज़ी से लागू कर सकता है, क्योंकि इसे अब इसके ओवरराइड की जांच करने की आवश्यकता नहीं है। फिर भी, हॉटस्पॉट यह समझने के लिए पर्याप्त स्मार्ट है कि final के उपयोग के बिना या बिना ओवरराइड नहीं हैं।

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

+0

निजी तरीकों के बारे में क्या? क्या उन्हें अंतिम कीवर्ड चाहिए? आखिरकार, वे निश्चित रूप से ओवरराइड नहीं किया जा सकता है। –

+0

@ SPIRiT_1984 'निजी 'विधियों को' अंतिम 'चिह्नित करने की आवश्यकता नहीं है - उन्हें अंतिम तरीकों के रूप में एक ही अनुकूलन से लाभ होता है (' स्थिर' विधियां भी प्राप्त होती हैं, क्योंकि उन्हें जावा में ओवरराइड नहीं किया जा सकता है)। – dasblinkenlight

+0

"जावा" (वास्तव में हॉटस्पॉट) आमतौर पर यह समझने के लिए पर्याप्त चालाक है कि कोई विधि कभी ओवरराइट नहीं की जाती है और क्या वे अनुकूलन किसी भी तरह से करते हैं, तो हाँ अंतिम अनुच्छेद। – Voo

1

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

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

+0

_if आप सुनिश्चित हैं कि विधि को फिर से परिभाषित नहीं किया जा रहा है, इसे अंतिम के रूप में चिह्नित करें ._ मुझे तब तक यह सुनिश्चित नहीं होगा जब तक कि मुझे कोई कारण पता न हो कि विधि _must_ को फिर से परिभाषित नहीं किया गया है (उदाहरण के लिए, यदि इसे किसी से कहा जाता है निर्माता)। सिर्फ इसलिए कि मैं किसी विधि को ओवरराइड करने का कोई कारण नहीं सोच सकता, इसका मतलब यह नहीं है कि कुछ अन्य प्रोग्रामर किसी कारण के बारे में नहीं सोचेंगे। –

+0

@ जेम्स-बड़े, आम तौर पर, जब आप एक लाइब्रेरी बना रहे हैं और यह नियंत्रित करना चाहते हैं कि कौन से वर्ग और विधियों को "अनुमत" ओवरराइड किया गया है, तो अंतिम कीवर्ड आपको ऐसा करने के लिए एक तंत्र देता है। यही मेरा मतलब है कि मेरे बयान से। – Farhad

+1

ठीक है, और मैं इसे तब तक नियंत्रित नहीं करना चाहूंगा जब तक कि मुझे एक विशेष मामले के बारे में पता न हो, जहां एक क्लाइंट ओवरराइड _my_ कक्षाओं में से किसी एक को जिस तरीके से वादा करता है उससे व्यवहार करने से रोक सकता है। –

1

मुझे लगता है कि यह सिफारिश थोड़ा बहुत ही विशिष्ट है।

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

मुझे यह भी पता चलता है कि विधि पैरामीटर के लिए अंतिम का उपयोग केवल "स्क्रीन स्पेस" का कचरा है (और इसके द्वारा: पाठक के पक्ष में "ऊर्जा" बर्बाद कर रहा है)।

दूसरी तरफ, कक्षा कक्षाओं के लिए केवल अंतिम विशेषताएं ऐसी कक्षाओं की वस्तुओं को अपरिवर्तनीय चीज़ों में बदल सकती हैं; और यह एक अच्छी बात है।

जैसा कि आप देखते हैं; फाइनल के उपयोग पर कई पेशेवर और विपक्ष हैं; और मुझे लगता है कि "पठनीयता" अक्सर "संभावित" प्रदर्शन सुधारों पर जीत जाती है।

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

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