2013-08-01 5 views
15

मुझे पता है कि कंपाइलर जावा में अंतिम कीवर्ड का व्याख्या कैसे करता है, लेकिन प्रोग्रामर को इसका अर्थ कैसे समझना चाहिए? यह होना चाहिए:अंतिम परिवर्तनीय व्याख्या

1) यह चर बदला नहीं जा सकता (उदाहरण के लिए भीतरी वर्ग)

या

2) मैं इस चर बदलने के लिए योजना नहीं बना रहा हूँ (पराक्रम द्वारा इस्तेमाल किया कुछ अनुकूलन है सदस्य चर के लिए लाभ)।

मैं पूछ रहा हूं क्योंकि मैंने कोड पर काम किया है जहां सब कुछ डिफ़ॉल्ट रूप से अंतिम (अंतिम विकल्प 2) घोषित किया गया है, जो मेरी राय में, कीवर्ड को घटा देता है और वास्तव में बदल नहीं सकता है! चर अंतिम घोषित करने में अभी भी प्रदर्शन लाभ है?

उत्तर

17

डिफ़ॉल्ट रूप से अंतिम रूप से अंतिम होने वाला सब कुछ अच्छा चीज़ है। जितना अधिक आप अपरिवर्तनीयता पर अपने कोड को मॉडल कर सकते हैं, उतना ही आसान होने का कारण बनता है।

final का उपयोग करना मेरी राय में प्रदर्शन के बारे में शायद ही कभी है। यह शेष कोड के बारे में दावा करने के बारे में है (कुछ भी इस चर को बदलता नहीं है) जो पाठक को कोड को समझने में मदद कर सकता है, और संकलक द्वारा जांच की जा सकती है।

संपादित करें: उपरोक्त फ़ील्ड के लिए मेरा दृश्य है। स्थानीय चर (पैरामीटर समेत) के लिए मैं व्यक्तिगत रूप से केवल final का उपयोग करता हूं जब परिवर्तनीय अज्ञात कक्षा में उपयोग किया जाएगा। यह फ़ील्ड से अलग है क्योंकि:

  • विधि के पूरे संदर्भ को देखना आसान है - और यदि ऐसा नहीं है, तो यह स्वयं में एक समस्या है।
  • चूंकि यह किसी ऑब्जेक्ट (या कक्षा) की स्थिति का प्रतिनिधित्व नहीं करता है, अपरिवर्तनीयता के लाभ वास्तव में लागू नहीं होते हैं।
+0

पर एक नज़र डालें, मैं इसे सदस्य चर के लिए स्वीकार करता हूं, स्थानीय चर और पैरामीटर के बारे में क्या? निश्चित रूप से उन्हें अंतिम रूप में चिह्नित करने में थोड़ा सा लाभ नहीं है जब तक उन्हें वास्तव में होने की आवश्यकता न हो? – StuPointerException

+0

कोड पढ़ने/बनाए रखने पर लाभ होता है। –

+0

मेरे पास 'अंतिम' के साथ एकमात्र पकड़ है कि मुझे इसे लिखने की ज़रूरत है। उदाहरण के लिए, यह विधि हस्ताक्षरों को कम करता है इसलिए मैं इसका उपयोग नहीं करता हूं। इसके बजाय मेरे पास एक बदलते पैरामीटर की एक कंपाइलर चेतावनी है। –

1

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

0

मुझे समझ में नहीं आता कि आपको लगता है कि मूल्य की कमी क्यों है।

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

+0

एक अंतिम सूची अपरिवर्तनीय नहीं है। –

+0

संदर्भ निश्चित रूप से है। आपको इसकी सामग्री को संशोधित करने के लिए एक सिंक्रनाइज़ संग्रह का उपयोग करना चाहिए। – duffymo

0

अंतिम चर a good thing आमतौर पर बोल रहे हैं। ध्यान दें कि इसका मतलब केवल यह है कि चर को पुन: असाइन नहीं किया जा सकता है, लेकिन यह ऑब्जेक्ट पर इंगित करता है बदल सकता है यदि यह परिवर्तनीय है।

विनिर्देश अंतिम क्षेत्रों में आक्रामक अनुकूलन की अनुमति देता है:

प्रदर्शन बुद्धिमान, final अधिक आक्रामक compiler optimisations अनुमति देता है। एक धागे के भीतर, अंतिम क्षेत्र के उन संशोधनों के साथ अंतिम क्षेत्र के पढ़ने को पुन: व्यवस्थित करने की अनुमति है जो कि कन्स्ट्रक्टर में नहीं होते हैं।

4

मैंने कुछ समय पहले a post about this लिखा था।(संभावित गड़बड़)

  • अंतिम सब कुछ के उपयोग के बिना परिवर्तनशील हो सकता है
  • यह एक चर सेट करने से पहले इसका इस्तेमाल किया जा सकता है (कंस्ट्रक्टर्स में उपयोगी) बलों
:

अंतिम मदद करता है पढ़ने कोड

फ़ाइनल का उपयोग करके आप संकलक को अपने कोड के बारे में कुछ बताते हैं और यह आपको बदले में मदद करता है।

-1

यह सच है कि अंतिम चर का उपयोग किया जाता है ताकि कोई भी मूल्य बदल सके, यह जावा में निरंतर काम करता है।

मुझे उदाहरण

मैं एक पैकेज है जो साथ ही किसी अन्य व्यक्ति द्वारा किया जा सकता बनाया है देता हूँ, अब वहाँ कुछ विन्यास चर है कि आदेश इसे ठीक से चलाने के लिए निर्धारित करने की आवश्यकता कर रहे हैं। आइए इसका लॉगिन पैकेज कहें। तो वहाँ की तरह

encryption_method = HASH_ENCRYPTION कुछ एन्क्रिप्शन विकल्प हो सकता है

या

encryption_method = SYMMETRIC_ENCRYPTION

बजाय पूर्णांक 1, 2, 3 गुजर हम अंतिम चर जो अधिक में डेवलपर मदद करता है परिभाषित कर सकते हैं की पठनीय रूप और ofcource मैं उपयोगकर्ता इसे बदल नहीं करना चाहती तो मैं रखने के लिए यह अंतिम है, और आंतरिक तर्क टूट सकता है

5

अंतिम कीवर्ड को छोड़ दिया जाना चाहिए, यह सभी लागू मामलों में मानक होना चाहिए, और अंतिम केवल तरह

this_variable_will_change_unexpectedly_behind_your_back 

एक कीवर्ड यह कीवर्ड किसी भी आईडीई द्वारा स्वतः पूर्ण नहीं चाहिए साथ revokable होना चाहिए, और यह करने के लिए संभव नहीं हो shoud इसे Ctrl-V के साथ डालें।

+3

पूरी तरह से राय आधारित है, लेकिन मैं इसके हर शब्द को साझा करता हूं :) –

+0

मुझे यह पसंद है, ctrl-V भाग के अलावा;) – StuPointerException

+3

और "चर" का मजाक यह है कि "यह आपकी पीठ के पीछे बदल सकता है "... गणितज्ञ क्या कहेंगे यदि उसका चर एक ही अभिव्यक्ति के अंदर सही हो गया है? –

1

मैं जो कुछ पहले ही कह चुका हूं, उससे ज्यादा कुछ नहीं जोड़ सकता, लेकिन केवल पूर्णता के लिए, JLS 17.5.3 का कहना है कि अंतिम फ़ील्ड भी अनुकूलन का कारण बन सकते हैं;

एक अंतिम क्षेत्र क्षेत्र घोषणा में एक संकलन समय निरंतर अभिव्यक्ति (§15.28) को आरंभ नहीं हो जाता है, तो अंतिम क्षेत्र में परिवर्तन, मनाया न हों, क्योंकि है कि अंतिम मैदान के का उपयोग करता है संकलन समय पर बदल दिया जाता है निरंतर अभिव्यक्ति के मूल्य के साथ

0

प्रत्येक चर को final के रूप में घोषित करना final कीवर्ड का अवमूल्यन नहीं कर रहा है। यह डेवलपर्स को चर के संशोधन की संभावना को रद्द करने के लिए आवेदन को डीबग करने में मदद करता है, खासकर आवेदन के बहु थ्रेडेड पर्यावरण के दौरान।

जावा 8 रिलीज के साथ

, हम एक और अवधारणा बुलाया "effectively final variable"

स्थानीय चर एक लैम्ब्डा अभिव्यक्ति से संदर्भित अंतिम या प्रभावी ढंग से अंतिम होना चाहिए

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

यदि आप अंतिम चर के रूप में प्रभावी अंतिम घोषित नहीं करना चाहते हैं, तो यह नई सुविधा आपको मदद करती है यदि आप लैम्ब्डा अभिव्यक्ति/अज्ञात कक्षाओं का उपयोग कर रहे हैं। आप effective final चर के लिए final कीवर्ड की घोषणा से बच सकते हैं। इस article