जावा: जब स्थिर विधियों का उपयोग करना है


911

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

जैसे

Obj x = new Obj();
x.someMethod

या

Obj.someMethod

(यह स्थिर तरीका है?)

मैं उलझन में हूँ!

जवाबों:


1458

एक नियम का अंगूठा: अपने आप से पूछें "क्या इस पद्धति को कॉल करने का कोई मतलब है, भले ही अभी तक कोई वस्तु का निर्माण नहीं किया गया हो?" यदि हां, तो यह निश्चित रूप से स्थिर होना चाहिए।

तो कक्षा में Carआपके पास एक विधि हो सकती है:

double convertMpgToKpl(double mpg)

... जो स्थिर होगा, क्योंकि कोई यह जानना चाहेगा कि 35mpg क्या करता है, भले ही किसी ने कभी निर्माण न किया हो Car। लेकिन यह विधि (जो किसी विशेष की दक्षता निर्धारित करती है Car):

void setMileage(double mpg)

... स्थैतिक नहीं हो सकता क्योंकि किसी भी Carनिर्माण से पहले विधि को कॉल करना अकल्पनीय है ।

(वैसे, कांसेप्ट हमेशा सही नहीं होता है: आपके पास कभी-कभी एक ऐसी विधि हो सकती है जिसमें दो Carऑब्जेक्ट शामिल होते हैं, और फिर भी चाहते हैं कि इसे हटा दिया जाए।

Car theMoreEfficientOf( Car c1, Car c2 )

हालाँकि इसे एक गैर-स्थैतिक संस्करण में परिवर्तित किया जा सकता है, कुछ का तर्क होगा कि चूंकि "विशेषाधिकार प्राप्त" विकल्प नहीं है, जिनमें Carसे अधिक महत्वपूर्ण है, तो आपको कॉल करने वाले को Carउस वस्तु को चुनने के लिए मजबूर नहीं करना चाहिए जिस वस्तु को आप आमंत्रित करेंगे; पर विधि। यह स्थिति सभी स्थिर तरीकों के एक छोटे से अंश के लिए है, हालांकि।)


325
यहाँ कुछ अच्छे उदाहरण हैं। हालांकि, मुझे लगता है कि "स्थिर" अक्सर मूल्यवान होता है जब आप जानते हैं कि कुछ उदाहरणों में परिवर्तन नहीं होने वाला है। यदि यह मामला है, तो मैं वास्तव में "सिंगल रिस्पॉन्सिबिलिटी प्रिंसिपल" पर विचार करूंगा, जिसका अर्थ है कि एक वर्ग के पास एक जिम्मेदारी होनी चाहिए और इस प्रकार परिवर्तन का केवल एक कारण होना चाहिए। मुझे लगता है कि किसी को "ConvertMpgToKpl (double mpg)" फ़ंक्शन और इसी तरह के तरीकों को अपनी कक्षा में स्थानांतरित करने पर विचार करना चाहिए। एक कार वस्तु का उद्देश्य कारों की तात्कालिकता की अनुमति देना है, न कि उनके बीच तुलना प्रदान करना। वे वर्ग के लिए बाहरी होना चाहिए।
ज़ैक जैनसेन

34
मुझे लगता है कि मैं विधि के बजाय Car#isMoreEfficientThan(Car)। इसका यह फायदा है कि आप जिस कार को टाई में लौटाते हैं, वह मनमाना नहीं है। यह एक टाई में लौटाए गए विधि के शीर्षक से स्पष्ट है।
Cruncher

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

7
वास्तव में, यह एक तुलनित्र के रूप में लागू किया जाना चाहिए ।
डॉगवाइडर

3
@ B1KMusic बेशक। "मैं कौन सी कार को टाई में लौटाता हूं" से इसका मतलब है "कार पर कॉल करने के लिए सही नक्शे, और पारित कार के लिए झूठे नक्शे"। यह अस्पष्टता के बिना है।
Cruncher

538

केवल निम्न स्थितियों में स्थिर विधियों को परिभाषित करें:

  1. यदि आप उपयोगिता वर्ग लिख रहे हैं और उन्हें परिवर्तित नहीं किया जाना चाहिए।
  2. यदि विधि किसी भी आवृत्ति चर का उपयोग नहीं कर रहा है।
  3. यदि कोई ऑपरेशन उदाहरण निर्माण पर निर्भर नहीं है।
  4. यदि कुछ कोड है जो आसानी से सभी उदाहरण विधियों द्वारा साझा किए जा सकते हैं, तो उस कोड को एक स्थिर विधि में निकालें।
  5. यदि आप सुनिश्चित हैं कि विधि की परिभाषा को कभी नहीं बदला जाएगा या ओवरराइड नहीं किया जाएगा। चूंकि स्थैतिक विधियां ओवरराइड नहीं की जा सकती हैं।

45
अच्छे अंक, लेकिन वे आवश्यकताएं हैं यदि आप एक विधि को स्थिर बनाना चाहते हैं , तो एक बनाने के कारणों को नहीं।
tetsuo

4
आवश्यकता के बारे में @Mohd 5: जब आप 100% सुनिश्चित हो सकते हैं कि कोई तरीका कभी नहीं बदला जाएगा या ओवरराइड नहीं किया जाएगा? उस समय हमेशा अज्ञात कारक नहीं होते हैं जिन्हें आप अपनी स्थैतिक विधि लिखते समय नहीं ले सकते हैं?
PixelPlex

8
"यूटिलिटी-क्लासेस" के बारे में तर्क करना बहुत मुश्किल है, बुरी बात यह है कि जितनी जल्दी या बाद में सब कुछ 'उपयोगिता' की तरह दिखने लगता है (हाँ, मैं उस "उपयोग" पैकेज का उल्लेख कर रहा हूं जो फूला हुआ, अछूत और खराब परीक्षण है), और आपके परीक्षण मामलों को और अधिक काम करने की आवश्यकता होगी (स्थैतिक बर्तनों को मिटाने के लिए)। पहले वस्तुओं को प्राथमिकता दें।
सर्जियो

2
@ यह उत्तर वही है जिसकी मुझे तलाश है। मुझे मल्टीथ्रेडिंग में स्थिर तरीकों का उपयोग करके बहुत सारी समस्याओं का सामना करना पड़ा। क्या आप कृपया विस्तार से अंक 2, 3 और (उदाहरण के लिए आपके लिए 100 अंगूठे ऊपर)
प्रकाश पांडे

मुझे लगता है कि "स्थिर वर्ग" का आविष्कार किया जाना चाहिए यदि आप स्थिर चर और विधियों का उपयोग करने जा रहे हैं।
रॉबर्ट रोचा

182

स्थैतिक तरीकों का उपयोग करने के कुछ मान्य कारण हैं:

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

  • व्यावहारिकता : कॉलिंग के बजाय new Util().method(arg), कॉल Util.method(arg), या method(arg)स्थिर आयात के साथ। आसान, छोटा।

  • विधियों को जोड़ना : आप वास्तव में चाहते थे कि कक्षा स्ट्रिंग के पास एक removeSpecialChars()इंस्टेंस विधि हो, लेकिन यह वहां नहीं है (और यह नहीं होना चाहिए, क्योंकि आपके प्रोजेक्ट के विशेष वर्ण अन्य प्रोजेक्ट से भिन्न हो सकते हैं), और आप इसे जोड़ नहीं सकते हैं (जावा के बाद से कुछ हद तक समझदार है), इसलिए आप एक उपयोगिता वर्ग बनाते हैं, और removeSpecialChars(s)इसके बजाय कॉल करते हैं s.removeSpecialChars()। मिठाई।

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

यदि आप एक सिंगलटन बनाना चाहते हैं, तो आपको एक स्थिर विधि भी बनानी होगी, लेकिन ... नहीं। मेरा मतलब है, दो बार सोचें।

अब, इससे भी महत्वपूर्ण बात यह है कि आप एक स्टैटिक विधि क्यों नहीं बनाना चाहेंगे ? मूल रूप से, बहुरूपता खिड़की से बाहर चला जाता है । आप विधि को ओवरराइड नहीं कर पाएंगे, और न ही इसे इंटरफ़ेस में घोषित कर सकते हैं (प्री-जावा 8) । यह आपके डिज़ाइन से बहुत लचीलापन लेता है। इसके अलावा, यदि आपको राज्य की आवश्यकता है , तो यदि आप सावधान नहीं हैं , तो आप बहुत से संगामिति और / या अड़चनें समाप्त करेंगे ।


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

@tetsuo धन्यवाद! आपका स्पष्टीकरण बहुत स्पष्ट है और प्रदान किए गए कारण बहुत तार्किक हैं और बहुत कुछ समझ में आते हैं।
डेनिस एम।

3
और हम प्रोग्रामर कभी भी अनावश्यक चीजों को सिर्फ इसलिए नहीं करते हैं क्योंकि वे शांत, सही हैं? +1
स्क्रैमूच

यही कारण है कि ने कहा कि एक स्थिर विधि एक पूर्ण नामित समारोह हो जाता है stackoverflow.com/questions/155609/...
Ivanzinho

मैं प्रदर्शन और व्यावहारिकता से सहमत हूं, लेकिन पवित्रता से नहीं। स्थिर विधि कक्षा के स्थिर सदस्यों (जो निजी हो सकती है) को संशोधित कर सकती है। यह उपयोगी हो सकता है। उदाहरण के लिए, आपके पास "स्थिर सिंक्रनाइज़ int आवंटित () {वापसी idNext ++;}" जैसी विधि हो सकती है। वास्तव में, एक स्थैतिक विधि साइड इफेक्ट्स के संदर्भ में एक गैर-स्थैतिक विधि के रूप में सिर्फ शुद्ध या अशुद्ध हो सकती है।
एडम गवने-कैन

42

मिसको के लेखों को पढ़ने के बाद मेरा मानना ​​है कि परीक्षण के दृष्टिकोण से स्थिर तरीके खराब हैं। इसके बजाय आपके पास कारखाने होने चाहिए (शायद एक निर्भरता इंजेक्शन उपकरण जैसे कि गुइसे का उपयोग करके )।

मैं कैसे सुनिश्चित करता हूं कि मेरे पास केवल एक चीज है

केवल कुछ में से एक है "मैं कैसे सुनिश्चित करता हूं कि मेरे पास केवल कुछ में से एक है" की समस्या अच्छी तरह से समाप्त हो गई है। आप अपने मुख्य में केवल एक ही ApplicationFactory का त्वरित उपयोग करते हैं, और परिणामस्वरूप, आप केवल अपने सभी एकल के एकल उदाहरण को त्वरित करते हैं।

स्थिर तरीकों के साथ मूल मुद्दा यह है कि वे प्रक्रियात्मक कोड हैं

स्थिर तरीकों के साथ मूल मुद्दा यह है कि वे प्रक्रियात्मक कोड हैं। मुझे इस बात का कोई अंदाजा नहीं है कि यूनिट-टेस्ट प्रक्रियात्मक कोड कैसे हो सकता है। यूनिट-परीक्षण मानता है कि मैं अपने आवेदन के एक टुकड़े को अलगाव में रख सकता हूं। तात्कालिकता के दौरान मैं मॉक / फ्रेंडली के साथ निर्भरता को तार करता हूं जो वास्तविक निर्भरता को प्रतिस्थापित करता है। प्रक्रियात्मक प्रोग्रामिंग के साथ "तार" कुछ भी नहीं है क्योंकि कोई वस्तु नहीं है, कोड और डेटा अलग-अलग हैं।


20
मैं इकाई-परीक्षण प्रक्रियात्मक कोड के लिए सक्षम नहीं होने के बारे में समझ नहीं पा रहा हूँ। क्या आप केवल "अपनी" इकाई के रूप में क्लास के साथ स्थिर विधि का उपयोग करके आउटपुट को सही करने के लिए सही इनपुट का परीक्षण करने वाले परीक्षण मामलों को सेट नहीं करते हैं?
tjb

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

4
@ संबद्ध: कृपया पॉवरमॉक पर एक नज़र डालें, जिसमें स्थैतिक तरीकों का मजाक उड़ाने की क्षमता हो। PowerMock का उपयोग करने पर कुछ परिदृश्य होते हैं, यदि कोई हो, जहां आपको विधि निर्भरता मिलती है, जिसका मजाक नहीं उड़ाया जा सकता है।
कार्ल्स सला

7
आप पॉवरमॉक का उपयोग करके स्टैटिक्स का परीक्षण कर सकते हैं, हालांकि आप जल्द ही आपको पर्मगेन स्पेस (जो कि टी-शर्ट मिल गया), और इसके अभी भी खराब हो गए हैं। जब तक आप नहीं जानते (कम से कम एक दशक में अपने स्वयं के अनुभव के आधार पर सही OO भाषाओं में, C से माइग्रेट नहीं कर रहे हैं) तब तक इसे न करें। सच में, सबसे बुरा कोड जो मैंने कभी देखा है, एक एम्बेडेड डेवलपर के स्टैटिक्स के उपयोग से आया है और ज्यादातर मामलों में हम इसके साथ, हमेशा के लिए फंस गए हैं, और अधिक कोड जोड़कर हमें अभी भी असंशोधित मोनोलिथ में और भी अधिक कसकर बंद कर दिया है। ढीला युग्मन: नहीं, परीक्षण योग्य: मुश्किल से, परिवर्तनीय: कभी नहीं। से बचें!
user1016765

14
मैं स्थैतिक तरीकों के परीक्षण की कठिनाई को समझ सकता हूं जो स्थिर अवस्था पर निर्भर करता है। लेकिन जब आप स्टैटिस्टिक स्टैटिक मेथड जैसे Math.abs()या Arrays.sort(), यहां तक ​​कि ऐसे तरीकों का परीक्षण कर रहे हैं , जिनमें आप सभी निर्भरताएं पार कर सकते हैं , तो मैं यह नहीं देखता कि यूनिट टेस्टिंग कैसे होगी। मैं कहूंगा कि अंगूठे का एक सरल नियम है: यदि आपके पास प्रक्रियात्मक तर्क का मजाक उड़ाने का कोई कारण होगा, तो इसे स्थिर तरीके से न रखें। मैं कभी भी बाहर नकली Arrays.sort()या करने के लिए एक कारण है Math.abs()
एंडी

36

एक staticविधि एक प्रकार की विधि है, जिसे किसी भी वस्तु की आवश्यकता नहीं है कि इसे शुरू करने के लिए आरम्भ किया जाए। क्या आपने देखा staticहै mainजावा में फ़ंक्शन में उपयोग किया जाता है ? किसी वस्तु को बनाए बिना कार्यक्रम का निष्पादन वहीं से शुरू होता है।

निम्नलिखित उदाहरण पर विचार करें:

 class Languages 
 {
     public static void main(String[] args) 
     {
         display();
     }

     static void display() 
     {
         System.out.println("Java is my favorite programming language.");
     }
  }

सबसे अच्छा जवाब वास्तव में
याह्या

20

जावा में स्थैतिक विधियाँ कक्षा से संबंधित हैं (इसका कोई उदाहरण नहीं)। वे कोई उदाहरण चर का उपयोग नहीं करते हैं और आमतौर पर मापदंडों से इनपुट लेते हैं, उस पर कार्रवाई करते हैं, फिर कुछ परिणाम देते हैं। उदाहरण विधियाँ वस्तुओं से जुड़ी होती हैं और जैसा कि नाम से ही स्पष्ट है कि उदाहरण चर का उपयोग कर सकते हैं।


12

नहीं, स्थैतिक विधियाँ एक उदाहरण के साथ संबद्ध नहीं हैं; वे वर्ग के हैं। स्थैतिक विधियाँ आपका दूसरा उदाहरण हैं; उदाहरण के तरीके पहले हैं।


1
यदि आपको ऑब्जेक्ट के राज्य जोड़तोड़ की आवश्यकता नहीं है, तो आपको स्थिर विधियों का उपयोग करना चाहिए।
MastAvalons

11

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

  1. एक स्थिर विधि एक वर्ग की वस्तु के बजाय कक्षा से संबंधित है।
  2. एक स्थिर विधि एक वर्ग की आवृत्ति बनाने की आवश्यकता के बिना आह्वान किया।
  3. स्थैतिक विधि स्थैतिक डेटा सदस्य तक पहुंच सकती है और इसके मूल्य को बदल सकती है।
  4. एक स्थिर विधि को केवल एक वर्ग डॉट स्थिर नाम के नाम का उपयोग करके एक्सेस किया जा सकता है। । । उदाहरण: Student9.change ();
  5. यदि आप किसी वर्ग के गैर-स्थिर क्षेत्रों का उपयोग करना चाहते हैं, तो आपको गैर-स्थिर पद्धति का उपयोग करना होगा।

// सभी वस्तुओं (स्थिर क्षेत्र) की आम संपत्ति को बदलने का कार्यक्रम।

class Student9{  
 int rollno;  
 String name;  
 static String college = "ITS";  

 static void change(){  
 college = "BBDIT";  
 }  

 Student9(int r, String n){  
 rollno = r;  
 name = n;  
 }  

 void display (){System.out.println(rollno+" "+name+" "+college);}  

public static void main(String args[]){  
Student9.change();  

Student9 s1 = new Student9 (111,"Indian");  
Student9 s2 = new Student9 (222,"American");  
Student9 s3 = new Student9 (333,"China");  

s1.display();  
s2.display();  
s3.display();  
}  }

O / P: 111 भारतीय BBDIT 222 अमेरिकी BBDIT 333 चीन BBDIT


10

स्थैतिक विधियाँ एक उदाहरण के साथ जुड़ी नहीं हैं, इसलिए वे कक्षा में किसी भी गैर-स्थिर क्षेत्र तक नहीं पहुँच सकते हैं।

यदि विधि वर्ग के किसी भी फ़ील्ड (या केवल स्थिर फ़ील्ड) का उपयोग नहीं करती है, तो आप एक स्थिर विधि का उपयोग करेंगे।

यदि किसी वर्ग के गैर-स्थैतिक क्षेत्र का उपयोग किया जाता है, तो आपको गैर-स्थैतिक विधि का उपयोग करना होगा।


1
स्पष्ट, छोटा और सरल उत्तर।
जोशी

8

स्टेटिक तरीकों को क्लास में बुलाया जाना चाहिए, इंस्टेंस के तरीकों को क्लास के इंस्टेंस पर बुलाया जाना चाहिए। लेकिन वास्तविकता में इसका क्या मतलब है? यहाँ एक उपयोगी उदाहरण है:

एक कार वर्ग में इंस्टेल्ट () नामक एक इंस्टेंस विधि हो सकती है। आप केवल एक कार में तेजी ला सकते हैं, अगर कार वास्तव में मौजूद है (निर्माण की गई है) और इसलिए यह एक उदाहरण विधि होगी।

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


6

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


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

5

जब आप कक्षा के एक उदाहरण के बिना विधि का उपयोग करने में सक्षम होना चाहते हैं, तो एक स्थिर विधि का उपयोग करें।


29
यह किसी प्रोग्राम के डिजाइन के लिए कोई औचित्य नहीं देता है।
adamjmarkham

4

स्थैतिक: Obj.someMethod

का प्रयोग करें staticजब आप एक विधि, यानी जहां विधि वर्ग का एक उदाहरण के बिना प्रतिदेय होना चाहिए करने के लिए वर्ग स्तर तक पहुँच प्रदान करना चाहते हैं।


4

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


1
वाह! जावा नूबी प्रश्नों को देखते हुए मैं कहाँ आ गया! यह एक छोटी सी दुनिया है :-)
दीपक

1
@ दिपक छोटी दुनिया वास्तव में :)
वैशाख सुरेश

4

स्थैतिक तरीके और चर जावा में 'ग्लोबल' कार्यों और चर के नियंत्रित संस्करण हैं। जिसमें तरीकों के रूप में classname.methodName()या classInstanceName.methodName()अर्थात, स्थिर तरीकों और चर को वर्ग नाम के साथ-साथ कक्षा के उदाहरणों से एक्सेस किया जा सकता है।

क्लास को स्टैटिक घोषित नहीं किया जा सकता है (क्योंकि इसका कोई मतलब नहीं है। यदि किसी वर्ग को सार्वजनिक घोषित किया जाता है, तो उसे कहीं से भी एक्सेस किया जा सकता है), इनर क्लास को स्टैटिक घोषित किया जा सकता है।


3

स्टेटिक तरीकों का इस्तेमाल किया जा सकता है

  • एक उदाहरण पर एक क्रिया नहीं करना चाहता (उपयोगिता के तरीके)

    जैसा कि इस पोस्ट में उपरोक्त कुछ उत्तरों में उल्लेख किया गया है, मील को किलोमीटर में परिवर्तित करना, या फ़ारेनहाइट से सेल्सियस तक तापमान की गणना करना और इसके विपरीत। स्थैतिक विधि का उपयोग करके इन उदाहरणों के साथ, यह ढेर स्मृति में पूरी नई वस्तु को तत्काल करने की आवश्यकता नहीं है। नीचे विचार करें

    1. new ABCClass(double farenheit).convertFarenheitToCelcium() 
    2. ABCClass.convertFarenheitToCelcium(double farenheit)

    पूर्व हर विधि आह्वान, प्रदर्शन, व्यावहारिक के लिए एक नया वर्ग पदचिह्न बनाता है । नीचे दिए गए गणित और अपाचे-कॉमन्स पुस्तकालय स्ट्रिंगग्रिल्स के उदाहरण हैं:

    Math.random()
    Math.sqrt(double)
    Math.min(int, int)
    StringUtils.isEmpty(String)
    StringUtils.isBlank(String)
  • एक साधारण फ़ंक्शन के रूप में उपयोग करना चाहता है। इनपुट्स को आसानी से पास किया जाता है, और परिणाम डेटा को रिटर्न वैल्यू के रूप में प्राप्त किया जाता है। वंशानुक्रम, वस्तु अस्थिरता चित्र में नहीं आती है। संक्षिप्त, पठनीय

नोट : कुछ लोग स्थिर तरीकों की परीक्षणशीलता के खिलाफ तर्क देते हैं, लेकिन स्थिर तरीकों का भी परीक्षण किया जा सकता है! JMockit के साथ, कोई स्थैतिक तरीकों का मजाक उड़ा सकता है। परीक्षण करने की क्षमता । नीचे उदाहरण:

new MockUp<ClassName>() {
    @Mock
    public int doSomething(Input input1, Input input2){
        return returnValue;
    }
};

3

जावा में स्टैटिक विधियाँ वे विधियाँ हैं जिन्हें कक्षा की वस्तु बनाए बिना कहा जा सकता है। यह वर्ग का है।

हम स्थैतिक विधि का उपयोग करते हैं जब हमें उदाहरण का उपयोग करके विधि को लागू करने की आवश्यकता नहीं होती है।


2

मैं सोच रहा हूं कि स्थैतिक तरीकों का उपयोग कब करना है?

  1. खेतों staticतक पहुँचने के लिए विधियों का एक सामान्य उपयोग है static
  2. लेकिन चर के staticसंदर्भ के बिना आपके पास तरीके हो सकते हैं staticstaticचर का संदर्भ लिए बिना हेल्पर विधियाँ कुछ जावा वर्गों जैसे जावा.लंग.मथ में पाई जा सकती हैं

    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }
  3. अन्य उपयोग के मामले में, मैं इन तरीकों के बारे में सोच सकता हूं कि synchronizedविधि के साथ संयुक्त बहु थ्रेडेड वातावरण में वर्ग स्तर लॉकिंग का कार्यान्वयन है।

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

यदि आपको कक्षा के उदाहरण ऑब्जेक्ट पर विधि का उपयोग करने की आवश्यकता है, तो आपकी विधि गैर-स्थिर होनी चाहिए।

ओरेकल प्रलेखन पृष्ठ अधिक जानकारी प्रदान करता है।

उदाहरण और वर्ग चर और विधियों के सभी संयोजनों की अनुमति नहीं है:

  1. इंस्टेंस विधियाँ इंस्टेंस चर और इंस्टेंस विधियों को सीधे एक्सेस कर सकती हैं।
  2. इंस्टेंस मेथड्स क्लास वेरिएबल्स और क्लास मेथड्स को सीधे एक्सेस कर सकते हैं।
  3. क्लास के तरीके सीधे क्लास वेरिएबल्स और क्लास के तरीकों तक पहुँच सकते हैं।
  4. क्लास मेथड्स सीधे वेरिएबल या इंस्टेंस मेथड्स तक नहीं पहुँच सकते हैं - उन्हें ऑब्जेक्ट रेफरेंस का उपयोग करना चाहिए। साथ ही, क्लास मेथड इस कीवर्ड का उपयोग नहीं कर सकते क्योंकि इसके लिए कोई उदाहरण नहीं है।

क्या हम नियमित तरीकों से स्थैतिक क्षेत्रों तक नहीं पहुँच सकते हैं? फिर यह A common use for static methods is to access static fields.कोई तर्क नहीं है।
पारसीक

2

एक स्थिर विधि के दो मुख्य उद्देश्य हैं:

  1. उपयोगिता या सहायक विधियों के लिए जिन्हें किसी वस्तु स्थिति की आवश्यकता नहीं होती है। चूंकि उदाहरण चर तक पहुंचने की कोई आवश्यकता नहीं है, स्थैतिक तरीके होने से कॉल करने वाले की आवश्यकता समाप्त हो जाती है ताकि वह वस्तु को कॉल कर सके।
  2. उस राज्य के लिए जो एक काउंटर की तरह, वर्ग के सभी उदाहरणों द्वारा साझा किया जाता है। सभी उदाहरणों को एक ही स्थिति साझा करनी चाहिए। वे विधियाँ जो केवल उस स्थिति का उपयोग करती हैं, स्थिर होनी चाहिए।

1

ग्रहण में आप एक चेतावनी को सक्षम कर सकते हैं जो संभावित स्थैतिक तरीकों का पता लगाने में आपकी मदद करता है। (हाइलाइट की गई रेखा के ऊपर एक और है जिसे मैं हाइलाइट करना भूल गया)

ग्रहण की सेटिंग


0

जब भी आप अपने कोड में एक विधि को कॉल करने के लिए एक ऑब्जेक्ट नहीं बनाना चाहते हैं तो बस उस विधि को स्थैतिक घोषित करें। चूंकि स्टैटिक विधि को कॉल करने के लिए किसी इंस्टेंस की आवश्यकता नहीं होती है, लेकिन यहां पर पकड़ को सभी स्टैटिक विधियों को जेवीएम द्वारा स्वचालित रूप से नहीं कहा जाता है। यह विशेषाधिकार केवल मुख्य () "सार्वजनिक स्थैतिक शून्य मुख्य [स्ट्रिंग ... args]" विधि से जावा में आनंद लिया जाता है क्योंकि रनटाइम में यह विधि हस्ताक्षर सार्वजनिक "स्थिर" शून्य मुख्य [] JVM द्वारा प्रवेश बिंदु के रूप में मांगी जाती है। कोड का निष्पादन शुरू करें।

उदाहरण:

public class Demo
{
   public static void main(String... args) 
   {
      Demo d = new Demo();

      System.out.println("This static method is executed by JVM");

     //Now to call the static method Displ() you can use the below methods:
           Displ(); //By method name itself    
      Demo.Displ(); //By using class name//Recommended
         d.Displ(); //By using instance //Not recommended
   }

   public static void Displ()
   {
      System.out.println("This static method needs to be called explicitly");
   }
} 

आउटपुट: - इस स्थिर विधि को JVM द्वारा निष्पादित किया जाता है। इस स्थिर विधि को स्पष्ट रूप से कहा जाना चाहिए। इस स्थिर विधि को स्पष्ट रूप से कहा जाना चाहिए। इस स्थिर विधि को स्पष्ट रूप से कहा जाना चाहिए।

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