ग्लोबल्स उस बुरे नहीं हैं। जैसा कि कई अन्य उत्तरों में कहा गया है, उनके साथ वास्तविक समस्या यह है कि आज, आपका वैश्विक फ़ोल्डर पथ, कल, कई में से एक हो सकता है, या सैकड़ों भी हो सकता है। यदि आप एक त्वरित, एक-बंद कार्यक्रम लिख रहे हैं, तो आसान होने पर ग्लोबल्स का उपयोग करें। आम तौर पर, हालांकि, जब आप केवल एक की आवश्यकता होती है, तब भी कई गुना की अनुमति देते हैं। एक बड़े जटिल कार्यक्रम का पुनर्गठन करना सुखद नहीं है जो अचानक दो डेटाबेस से बात करने की आवश्यकता है ।
लेकिन वे विश्वसनीयता को चोट नहीं पहुंचाते हैं। आपके प्रोग्राम में कई स्थानों से संदर्भित कोई भी डेटा अनपेक्षित रूप से बदलने पर समस्या पैदा कर सकता है। जब वे संग्रह कर रहे हैं, तो एन्यूमरेटर्स घुट जाता है, मध्य-गणना में बदल जाता है। इवेंट कतार इवेंट एक दूसरे पर चाल खेल सकते हैं। धागे हमेशा कहर बरपा सकते हैं। जो कुछ भी स्थानीय चर या अपरिवर्तनीय क्षेत्र नहीं है वह एक समस्या है। ग्लोबल्स इस तरह की समस्या है, लेकिन आप इसे गैर-वैश्विक बनाकर ठीक नहीं करेंगे।
यदि आप किसी फ़ाइल और फ़ोल्डर पथ में परिवर्तन करने वाले हैं, तो परिवर्तन और लेखन को सिंक्रनाइज़ करने की आवश्यकता है। (जैसे कि एक हजार चीजें जो गलत हो सकती हैं, कहते हैं कि आप पथ को पकड़ लेते हैं, फिर उस निर्देशिका को हटा दिया जाता है, फिर फ़ोल्डर पथ को एक अच्छी निर्देशिका में बदल दिया जाता है, फिर आप कोशिश करते हैं और हटाए गए निर्देशिका में लिखते हैं।) समस्या मौजूद है या नहीं फ़ोल्डर पथ वैश्विक है या एक हजार में से एक है जो वर्तमान में प्रोग्राम उपयोग कर रहा है।
खेतों के साथ एक वास्तविक समस्या है जो एक कतार में विभिन्न घटनाओं, पुनरावृत्ति के विभिन्न स्तरों या अलग-अलग थ्रेड्स द्वारा पहुँचा जा सकता है। इसे सरल (और सरल) बनाने के लिए: स्थानीय चर अच्छे हैं और क्षेत्र खराब हैं। लेकिन पूर्व ग्लोबल्स अभी भी क्षेत्र बनने जा रहे हैं, इसलिए यह (हालांकि गंभीर रूप से महत्वपूर्ण) मुद्दा वैश्विक क्षेत्रों की अच्छी या बुरी स्थिति पर लागू नहीं होता है।
इसके अलावा: समस्याएँ बढ़ रही हैं:
(ध्यान दें कि आपको इवेंट कतार या पुनरावर्ती कॉल के साथ समान समस्याएं हो सकती हैं, लेकिन मल्टीथ्रेडिंग सबसे खराब है।) निम्नलिखित कोड पर विचार करें:
if (filePath != null) text = filePath.getName();
यदि filePath
कोई स्थानीय चर या किसी प्रकार का स्थिरांक है, तो आपका प्रोग्राम विफल होने के कारण नहीं चल रहा है क्योंकि filePath
यह अशक्त है। चेक हमेशा काम करता है। कोई अन्य धागा इसके मूल्य को बदल नहीं सकता है। अन्यथा , कोई गारंटी नहीं है। जब मैंने जावा में मल्टीथ्रेडेड प्रोग्राम लिखना शुरू किया, तो मुझे हर समय इसी तरह लाइनों पर NullPointerException मिली। कोई भीअन्य थ्रेड किसी भी समय मूल्य बदल सकते हैं, और वे अक्सर करते हैं। जैसा कि कई अन्य उत्तर बताते हैं, यह परीक्षण के लिए गंभीर समस्याएं पैदा करता है। उपरोक्त कथन एक अरब बार काम कर सकता है, इसे व्यापक और व्यापक परीक्षण के माध्यम से प्राप्त कर सकता है, फिर उत्पादन में एक बार उड़ा सकता है। उपयोगकर्ता समस्या को पुन: उत्पन्न करने में सक्षम नहीं होंगे, और यह तब तक नहीं होगा जब तक वे खुद को आश्वस्त नहीं करते कि वे चीजों को देख रहे थे और इसे भूल गए।
ग्लोबल्स में निश्चित रूप से यह समस्या है, और यदि आप उन्हें पूरी तरह से समाप्त कर सकते हैं या उन्हें स्थिरांक या स्थानीय चर के साथ बदल सकते हैं, तो यह बहुत अच्छी बात है। यदि आपके पास वेब सर्वर पर स्टेटलेस कोड चल रहा है, तो आप शायद कर सकते हैं। आमतौर पर, आपकी सभी मल्टीथ्रेडिंग समस्याओं को डेटाबेस द्वारा लिया जा सकता है।
लेकिन अगर आपके प्रोग्राम को एक उपयोगकर्ता कार्रवाई से अगले तक की चीजों को याद रखना है, तो आपके पास किसी भी चलने वाले थ्रेड द्वारा पहुंच योग्य फ़ील्ड होंगे। वैश्विक को ऐसे गैर-वैश्विक क्षेत्र में बदलने से विश्वसनीयता में मदद नहीं मिलेगी।