2008-09-07 27 views
28

इसके अतिरिक्त, उदाहरण विधियों पर स्थैतिक तरीकों के लिए कोई प्रदर्शन लाभ हैं?एक विधि स्थिर होना चाहिए?

जब एक विधि स्थिर होना चाहिए: http://www.cafeaulait.org/course/week4/22.html:

मैं हाल ही में निम्नलिखित भर में आया था?

  1. न तो से पढ़ता है और न ही दृष्टांत फ़ील्ड
  2. वस्तु के राज्य के स्वतंत्र
  3. गणितीय तरीकों कि तर्क को स्वीकार करने में लिखते हैं, उन तर्क के लिए एक मूल्य के लिए एक एल्गोरिथ्म लागू होते हैं, और वापसी
  4. फैक्टरी तरीकों कि कंस्ट्रक्टर्स

के एवज में की सेवा मैं बहुत ढेर की प्रतिक्रिया में रुचि होगी इस पर ओवरफ्लो समुदाय।

उत्तर

20

जब वे उदाहरण का हिस्सा नहीं हैं तो विधिएं स्थिर बनाएं। सूक्ष्म अनुकूलन पसीना मत करो।

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

0

यहां why String.Format is static के बारे में एक संबंधित चर्चा है जो कुछ कारणों को उजागर करेगी।

15

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

1

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

लेकिन, यह शोर में सही होने की संभावना है - खासकर उन भाषाओं के लिए जो अनावश्यक पैरामीटर को अनुकूलित करने की अनुमति देते हैं।

+0

जब यह महत्वपूर्ण है (अधिकांश समय) संकलक द्वारा पूरी तरह से अनुकूलित अनुकूलित में नीचे। –

+0

इसे सी ++ में अनुकूलित नहीं किया जा सकता है। कॉलर के पास यह जानने का कोई तरीका नहीं है कि कैली "इस" का उपयोग नहीं करेगा, इसलिए इसे ध्यान में रखना होगा। अन्य भाषाओं के लिए, वाईएमएमवी। – Roddy

2

@jagmal मुझे लगता है कि आपको कुछ तारों को कहीं पार किया गया है - आपके द्वारा सूचीबद्ध सभी उदाहरण स्पष्ट रूप से स्थिर तरीके नहीं हैं।

स्टेटिक विधियों को पूरी तरह से सार के गुणों और अवधारणाओं के साथ सौदा करना चाहिए - उन्हें किसी विशेष तरीके से विशिष्ट विशेषताओं से संबंधित नहीं होना चाहिए (और अधिकांश कंपेलर चिल्लाएंगे यदि वे करते हैं)।

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

+3

आप सही हैं। मैं वास्तव में चीजें वास्तव में मिश्रित हो गया था। हो सकता है क्योंकि मैं उन दिनों के दौरान नींद सो गया था। एसओ की भावना में, मैंने टिप्पणी हटा दी है और मुझे नहीं लगता कि मेरे पास पहले से बताए गए लोगों की तुलना में कुछ और जोड़ने के लिए कुछ और है। फिर भी धन्यवाद। – Jagmal

2

बस याद रखें कि जब भी आप एक स्थिर विधि लिख रहे हों, तो आप एक लचीली विधि लिख रहे हैं जिसका व्यवहार बहुत आसानी से संशोधित नहीं हो सकता है।

आप प्रक्रियात्मक कोड लिख रहे हैं, इसलिए यदि यह प्रक्रियात्मक होने का अर्थ है, तो इसे करें। यदि नहीं, तो यह शायद एक उदाहरण विधि होना चाहिए।

यह विचार an article by Steve Yegge से लिया गया है, जो मुझे लगता है कि एक दिलचस्प और उपयोगी पढ़ा है।

12

स्थैतिक तरीकों के साथ एक और समस्या यह है कि जावा में कम से कम, उनके लिए यूनिट परीक्षण लिखना काफी दर्दनाक है। आप किसी भी तरह से एक स्थिर विधि नकल नहीं कर सकते हैं। post on google testing blog about this issue है।

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

+0

इस उत्तर के लिए धन्यवाद। मैं अक्सर कुछ विधियों को स्थिर बना देता हूं (क्योंकि वे वास्तव में उदाहरण का सीधे हिस्सा नहीं हैं)। लेकिन अब मैं उन विधियों को स्थिर कारण बनाने से बचता हूं, आप इसके साथ सही हैं, मॉकिंग संभव नहीं होगा – flipperweid

0

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

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