हम वसंत में स्थैतिक क्षेत्रों को स्वाहा क्यों नहीं कर सकते?


96

हम स्प्रिंग बीन में स्थिर उदाहरण चर को क्यों नहीं प्राप्त कर सकते हैं। मुझे पता है कि इसे प्राप्त करने का एक और तरीका है लेकिन हम जानना चाहते हैं कि हम इसे नीचे क्यों नहीं कर सकते हैं।

जैसे

@Autowired
public static Test test;

क्या आप जिस वैकल्पिक तरीके का जिक्र कर रहे हैं, उस पर कुछ प्रकाश डाला जा सकता है।
समशर्स

आप कंस्ट्रक्टर के माध्यम से ऑटोप्वाय कर सकते हैं या @PostConstuct
gagarwa

जवाबों:


69

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

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


11
इस के लिए एक चेतावनी है कि मुझे सामना करना पड़ा है परीक्षण के दौरान। यदि आप @BeforeClassएक स्प्रिंगजुनिट 4 क्लैसररनर में उपयोग करना चाहते हैं , और @Autowiredपरीक्षण में उस विधि का उपयोग सेम है .. तो आप मूल रूप से नहीं कर सकते। जो कष्टप्रद है।
जेसन पॉलिटिक्स

4
यह उत्तर बताता है कि यह क्यों नहीं होना चाहिए "लेकिन इसका असली मकसद यह है कि जब ढांचा स्थिर वर्ग को एक बीन में तार करने की कोशिश करता है तो यह अभी तक कक्षा लोडर द्वारा लोड नहीं किया जा सकता है।
एंड्रिया टी

51
यह उत्तर पूर्ण संवेदनहीन है। स्प्रिंग आपकी परीक्षण रणनीति को लागू नहीं करता है। इसका उत्तर यह है कि अभी तक स्प्रिंग लाइब्रेरी लोड नहीं हुई है, जब स्टैटिक क्लास को क्लास लोडर द्वारा त्वरित किया जाता है।
एंड्रिया टी

7
@AndreaT द्वारा दिए गए उत्तर को स्वीकृत उत्तर होना चाहिए।
चिराग अग्रवाल

3
स्टैटिक तरीके परीक्षण के लिए आसान हैं, कठिन नहीं। वसंत के बाद स्वचालित रूप से इंजेक्शन निर्भरता अच्छा लगता है, लेकिन यह वास्तव में परीक्षण के लिए कठिन मार्ग है। मोक्स, स्टब्स और टेस्ट डबल्स कोड स्मेल हैं, स्टैटिक तरीके नहीं।
mttdbrd

150

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


46
एक उत्तर के लिए धन्यवाद जो वास्तव में इस सवाल का जवाब देने के बजाय प्रतीत होता है कि केवल एक राय देने के बजाय जावा भाषा का आधा हिस्सा एक बुरा विचार है।
वारेन ड्यू

1
"स्टेटिक क्लास"?
अरुण राज

यह सही नहीं लगता है, जैसा कि मॉकिटो स्थिर क्षेत्रों में वस्तुओं को इंजेक्ट करने में सक्षम है, वसंत कैसे ऑटोवैयरिंग के समान है ... हालांकि मुझे नहीं पता कि कार्यान्वयन समान है। अधिक जानकारी चाहिए।
गागरवा

Mockito कठबोली स्थैतिक तरीकों का मजाक उड़ाते हैं। आपको स्टैटिक विधियों का उपयोग करने के लिए पावरमॉक का उपयोग करने की आवश्यकता है
वर्गीज

17

ओओपी अवधारणा के अनुसार, यह खराब डिजाइन होगा यदि स्थिर चर को ऑटो किया गया है।

स्टेटिक वैरिएबल ऑब्जेक्ट की प्रॉपर्टी नहीं है, बल्कि यह क्लास की प्रॉपर्टी है। स्प्रिंग ऑटो वायरिंग वस्तुओं पर किया जाता है, और यह मेरी राय में डिजाइन को साफ करता है। आप एकल के रूप में ऑटो वायर्ड बीन ऑब्जेक्ट को तैनात कर सकते हैं, और इसे स्थिर को परिभाषित करने के समान ही प्राप्त कर सकते हैं।


15

इस समाधान से आप वसंत में स्थैतिक क्षेत्रों को स्वाहा कर सकते हैं।

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}

4
Bugfinder गैर स्थैतिक विधि से स्थैतिक क्षेत्र स्थापित करने के बारे में शिकायत करेगा।
नेफ्तानिक

@ गैर-स्थिर लोगों से स्थिर सदस्यों को संदर्भित करता है काम करता है, उलटा नहीं करता है
younes zeboudj
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.