2009-04-08 17 views
20

जावा में, स्थिर गैर अंतिम चर का उपयोग कब किया जाना चाहिए?सर्वश्रेष्ठ अभ्यास: जावा स्थैतिक गैर अंतिम चर

उदाहरण

private static int MY_VAR = 0; 

जाहिर है के लिए हम स्थिरांक के बारे में यहाँ बात नहीं कर रहे।

public static final int MY_CONSTANT = 1; 

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

ऐसा लगता है कि यह दुर्लभ है कि उन्हें अभ्यास में इस्तेमाल किया जाना चाहिए। तुम क्या सोचते हो?

उत्तर

21

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

यह निश्चित रूप से बहुत ही दुर्लभ है (न्यायसंगत) गैर-अंतिम स्थैतिक चर।

+0

+1, लेकिन परमाणुओं का उपयोग करें। इसे "स्थैतिक" मानते हुए, मान लें कि एकाधिक धागे का उपयोग होगा। –

6

जब कैश, लॉगिंग, आंकड़े या डीबग स्विच के रूप में उपयोग किया जाता है तो स्पष्ट उचित उपयोग होते हैं। बिल्कुल निजी, सभी निजी।

यदि आपके पास अंतिम क्षेत्र में आवंटित म्यूटेबल ऑब्जेक्ट है, तो यह नैतिक रूप से एक उत्परिवर्तनीय फ़ील्ड जैसा ही है।

कुछ भाषाएं, जैसे फैन, पूरी तरह से परिवर्तनीय सांख्यिकी (या समतुल्य) को अस्वीकार करती हैं।

+0

http://code.google.com/p/noop/ में कोई भी स्थिरता नहीं है – Eduardo

2

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

0

मुझे लगता है कि आपकी स्टेटिक्स को लपेटना और सिंगलेट्स (या कम से कम स्थिर तरीकों के माध्यम से) के माध्यम से पहुंच प्रदान करना आम तौर पर एक अच्छा विचार है, क्योंकि आप बेहतर नियंत्रण को नियंत्रित कर सकते हैं और कुछ रेस स्थिति और सिंक्रनाइज़ेशन समस्याओं से बच सकते हैं।

0

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

1

स्थिर चर का उपयोग अनुप्रयोग-स्तरीय व्यवहार को नियंत्रित करने के लिए किया जा सकता है, उदाहरण के लिए वैश्विक लॉगिंग स्तर निर्दिष्ट करना, सर्वर से कनेक्ट करने के लिए।

मैं पुराने उपयोग में ऐसे उपयोग मामलों को मिला हूं, आमतौर पर अन्य कंपनियों से आ रहा है।

आजकल ऐसे उद्देश्यों के लिए स्थैतिक चर का उपयोग कर खराब अभ्यास है, लेकिन यह 1 999 में इतना स्पष्ट नहीं था।कोई वसंत नहीं, कोई log4j नहीं, आर.सी. मार्टिन इत्यादि से कोई साफ कोड नहीं

जावा भाषा अब काफी पुरानी है, और यहां तक ​​कि अगर कुछ सुविधा अब दृढ़ता से निराश हो जाती है, तो अक्सर शुरुआत में इसका उपयोग किया जाता था। और पिछड़े संगतता के कारण यह बदलने की संभावना नहीं है।

0

व्यक्तिगत रूप से कक्षा गैर-अंतिम चर के लिए मैं कैमेलकेस नोटेशन का उपयोग करता हूं। यह कोड से स्पष्ट है कि यह एक वर्ग चर है क्योंकि आपको इसे संदर्भित करना होगा: FooBar.bDoNotRunTests

उस नोट पर, मैं स्थानीय स्कोप चर से अलग करने के लिए this के साथ क्लास इंस्टेंस चर को उपसर्ग करता हूं। पूर्व। this.bDoNotRunTests

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