2011-02-01 17 views
5

जावा में, सी ++ में कोई वैश्विक पहुंच नहीं है। तो अगर कोई ऑब्जेक्ट्स का कंटेनर बनाना चाहता था तो उसे क्या करना होगा जिसे किसी भी वर्ग से एक्सेस किया जा सकता है? या एक जावा बीन कहें जो वैश्विक मूल्य रखता है।जावा में वैश्विक पहुंच

उदाहरण के लिए, यदि मैं एक लिफ्ट सिम्युलेटर बना रहा हूं, तो फ़ील्ड जिन्हें int numElevators जैसे सभी के बारे में जाना जाना चाहिए, कहीं सही होना चाहिए? लिफ्ट Elevators[] elevators के लिए संग्रह ऑब्जेक्ट के साथ ही।

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

+4

आमतौर पर, एक काफी सुरुचिपूर्ण समाधान वैश्विक या समकक्ष चीजों का उपयोग नहीं कर रहा है;) – delnan

+1

मुमकिन लिफ्ट एक इमारत में कर रहे हैं? एक इमारत वर्ग समझ में आता है। – diagonalbatman

उत्तर

4

मैं Elevators का संग्रह रखने के लिए Building के उदाहरण की अपेक्षा करूंगा। मुझे लगता है कि ऐसी परियोजना में बहुत कम चीजें हैं जो वास्तव में वैश्विक हैं और आप आमतौर पर कुछ प्रबंधन इकाई ढूंढ सकते हैं जिसमें इस ज्ञान को शामिल और वितरित किया जाना चाहिए।

ऐसी इकाई के भीतर इसे बांधकर, आप ए) नियंत्रण को आसानी से बदल सकते हैं और बदल सकते हैं/पुनः प्रतिक्रिया कर सकते हैं b) इसे मॉक करें और परीक्षण को आसान बनाएं।

+0

यह बिल्कुल सही तरीका है।99% उस समय जब आप सिंगलटन का उपयोग करना चाहते थे, वास्तव में किसी ऑब्जेक्ट से जुड़ा हो सकता है। एक और कठिन उदाहरण कुछ ऐसे कदमों की तरह है जो आप सिमुलेशन चलाने के लिए चाहते हैं - लेकिन इसे "सिमुलेशन" ऑब्जेक्ट करके निपटाया जा सकता है। – DJClayworth

+0

मुझे एक प्रबंधन इकाई का विचार पसंद है और वह भी जो ज्ञान को वितरित करता है। तो क्या एक अच्छा डिज़ाइन एक सिंगलटन क्लास होगा जो लिफ्ट धारण करता है, और एक लिफ्ट मैनेजर क्लास जिसमें उस सिंगलटन बल्बिंग ऑब्जेक्ट का संदर्भ है? – Steve

+0

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

0

आप सार्वजनिक स्थैतिक क्षेत्रों के समूह के साथ एक कक्षा बना सकते हैं।

class AppGlobals { 
    public static final String IMPORTANT_STUFF = "something global..."; 
    .... 

} 

या स्ट्रिंग्स और व्हाट्नॉट जैसे सरल डेटा प्राप्त करने के लिए आप गुण कॉन्फ़िगरेशन में पढ़ सकते हैं।

तुम भी गठजोड़ कर सकते हैं 1 और 2

संपादित करें - अपने लिफ्ट/इमारतों उदाहरण के लिए, उचित OO डिजाइन वैश्विक की आवश्यकता को समाप्त होगा ....

1

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

नहीं, ऐसा करने का यह तरीका है। स्थिर तरीकों और सिंगलेट्स का संयोजन।

+0

मेरे पास सिंगलटन बिल्डिंग क्लास है लेकिन हमेशा बिल्डिंग .getElevators() को कॉल करना बेहद सुंदर लगता है। – Steve

+0

क्यों? जब आप इसके बारे में सोचते हैं तो आप उस इमारत के लिए लिफ्ट प्राप्त कर रहे हैं जिसके साथ आप काम कर रहे हैं। नाम वर्णनात्मक है। –

1

आप वांछित फ़ील्ड के साथ एक गैर-सिंगलटन कक्षा बना सकते हैं, और इसकी आवश्यकता के लिए इसका एक उदाहरण प्रदान कर सकते हैं।

एक ऐसे संदर्भ को मानने वाले आपके कोड की मात्रा को कम करने से बाद में कई संदर्भों में अनुकूलित करना आसान हो जाता है।

उदाहरण के लिए, आप लिफ्टों के एक सेट के साथ शुरू कर सकते हैं, लेकिन बाद में विभिन्न टावरों या इमारतों के लिए कई सेट चाहते हैं।

0

यदि आप सिंगलटन से दूर रह रहे हैं तो आप मोनोस्टेट डिज़ाइन पैराडिग में देखना चाहेंगे। यहां पर एक अच्छा स्टैक ओवरफ्लो प्रश्न है।

Monostate vs. Singleton

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