2012-07-04 9 views
10

मुझे SO में एक पोस्ट विधि मिली है जो एक आवृत्ति विधि से स्थिर क्षेत्र में लिखने से रोकने के लिए आवश्यक कोड परिवर्तन पर चर्चा कर रही है लेकिन ऐसा करने का अच्छा अभ्यास क्यों नहीं है? जावा डिजाइनर ने तब क्यों अनुमति दी? दूसरे शब्दों में संकलक एक त्रुटि क्यों नहीं फेंकता है जब कोई ऐसा करने का प्रयास करता है?जावा में उदाहरण विधि से स्थैतिक क्षेत्र को लिखना अच्छा क्यों नहीं है?

उत्तर

12

'findbugz' प्रलेखन के शब्दों में:

इस उदाहरण विधि एक स्थिर क्षेत्र के लिए लिखता है। यदि कई उदाहरणों का उपयोग किया जा रहा है, और आम तौर पर खराब अभ्यास किया जा रहा है तो यह सही हो सकता है।

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

+0

इस कोड में समवर्ती रूप से चलने वाले एकाधिक धागे कैसे चलते हैं इसे खराब बनाते हैं? मेरा सवाल वास्तव में इसका जवाब देना था। क्या हमारे पास क्षेत्र के कई उदाहरण बनाने की संभावना है? – Inquisitive

+0

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

0

उपरोक्त के अतिरिक्त, देखने के एक दस्तावेज के बिंदु से यह आसान किसी को यह एक उदाहरण क्षेत्र है ग्रहण करने के लिए है, यदि आप फार्म का उपयोग करें:

someField = null 

या

myObj.someField = null 

फॉर्म का उपयोग

myClass.someField = null 

इसे स्पष्ट बनाता है और खोजबग चेतावनी को रोकता है (जाहिर है, मैंने परीक्षण नहीं किया है)। नोट, जो वर्णित बहु-थ्रेडिंग समस्याओं को नहीं रोकेगा।

0

यह उपयोगी हो सकता है, उदाहरण के लिए यदि आपको एक ऐसा एप्लिकेशन मिला जो चींटियों का प्रबंधन करता है और आपको चींटी कक्षा से बनाए गए चींटियों की कुल संख्या में प्रवेश करने में सक्षम होना चाहिए। यह एक स्थैतिक विधि को लिखकर किया जा सकता है जो हर बार जब आप एक नई चींटी बनाते हैं तो स्थिर विधि addAnt() में लिखते हैं, चींटियों की कुल संख्या का ट्रैक रखता है;

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

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