2009-04-28 14 views
25

मैं एक ही वर्ग की वस्तुओं के विभिन्न उदाहरणों के बीच एक वस्तु साझा करना चाहता हूं।जावा में स्थिर फ़ील्ड का सटीक अर्थ क्या है?

वैचारिक रूप से, मेरे कार्यक्रम चल रहा है, जबकि, सभी वर्ग की वस्तुओं एक पहुँच वर्ग बी के एक ही वस्तु

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

स्थिर फ़ील्ड का उपयोग करने के पीछे आम तौर पर त्रुटियां क्या होती हैं?

क्या कोई विकल्प हैं (जिन्हें कार्यान्वयन के एक बड़े प्रयास की आवश्यकता नहीं है)?

+1

स्थिर JVM चौड़ा है तो हाँ आप एक ही वी एम में दो कार्यक्रमों वे एक ही वस्तु बी –

+8

Nuno acessing किया जाना चाहिए अगर: कक्षा लोडर उदाहरण विस्तृत। –

उत्तर

55

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

एक ही जेवीएम के भीतर दो प्रोग्राम चलाने के लिए - यह वास्तव में "दो प्रोग्राम चलाने" से आपका क्या मतलब है पर निर्भर करता है। स्थिर क्षेत्र प्रभावी रूप से क्लास ऑब्जेक्ट से जुड़ा हुआ है, जो बदले में क्लासलोडर से जुड़ा हुआ है। तो यदि ये दो प्रोग्राम अलग-अलग क्लासलोडर उदाहरणों का उपयोग करते हैं, तो आपके पास दो स्वतंत्र स्थैतिक चर होंगे। यदि वे दोनों एक ही क्लासलोडर का उपयोग करते हैं, तो केवल एक ही होगा ताकि वे एक दूसरे के परिवर्तन देखेंगे।

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

+0

विकल्प के लिए धन्यवाद ... यही वह था जो मैं पहले कर रहा था, मैं इसका उल्लेख करना भूल गया ... लेकिन साझा ऑब्जेक्ट को पास करने में सक्षम कन्स्ट्रक्टर अब लाइब्रेरी में उपलब्ध नहीं है .... – LB40

2

स्टेटिक विधियों और सदस्यों को हतोत्साहित किया जाता है क्योंकि उन्हें अक्सर दुरुपयोग किया जाता है, लेकिन यह ऐसी स्थिति की तरह लगता है जहां स्थैतिक जाने का सही तरीका है। कई कार्यक्रमों में स्थिर साझा करने के लिए, यह मामला नहीं है। प्रत्येक कार्यक्रम पूरी तरह से अलग वातावरण में चलाता है।

-1

जो आप खोज रहे हैं उसे Singleton Pattern कहा जाता है।

+2

उसने नहीं दिया कक्षा बी के आलसी तत्कालता की आवश्यकता। सिंगलटन का ओवरलैप्लिकेशन मेरी आईयर कमाता है। – Welbog

+0

आलसी का उपयोग करने का एकमात्र कारण आलसी तात्कालिकता नहीं है। यह भी उपयोगी है अगर आपको अन्य वस्तुओं, इस प्रकार नाम के बीच साझा करने के लिए कक्षा के एक सिंगल उदाहरण की आवश्यकता है। –

+3

स्टेटिक एक ही उदाहरण प्राप्त करने के लिए पर्याप्त है। यही स्थिर है। सिंगलटन विशेष रूप से तब प्रयोग किया जाता है जब आप एक उदाहरण चाहते हैं और आपको इसे आलसी तरीके से उदाहरण देने की आवश्यकता है। सिंगलटन का उपयोग करते समय यह आवश्यक नहीं है सिंगलटन, नीचे की रेखा का एक गलत एप्लीकेशन है। – Welbog

-1

मान लें कि सबकुछ एक ही कक्षा लोडर में है, तो ऐसा करने के लिए monostate पैटर्न का उपयोग क्यों न करें?

आपकी साझा स्थिर monostate में छिपा हुआ है:

 

    public class Monostate { 

     private static String str = "Default"; 

     public String getString() { 
      return str; 
     } 

     public void setString(String s) { 
      str = s; 
     } 
    } 

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

 
    Monostate mono = new Monostate(); 
    mono.setString("Fred"); 
    System.out.println(mono.getString()); 
+0

क्यों नहीं? क्योंकि यह इसके बारे में है कि यह क्या करता है। यह सिंगलटन "पैटर्न" समझदार बनाता है। –

+0

मैं बस इतना करने की कोशिश कर रहा था कि एलबी एक विकल्प दें, जिसे उसने पूछा था। शायद ऊपर दिया गया उदाहरण बहुत सरल है। शायद रॉबर्ट मार्टिन द्वारा यह पत्र जो मोनोस्टेट और सिंगलटन की तुलना और विरोधाभास करता है, मदद कर सकता है: http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf –

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