java - जावा: स्थिर विधियों का उपयोग कब करें




static-methods (14)

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

  1. static तरीकों के लिए एक सामान्य उपयोग static क्षेत्रों तक पहुंचना है।
  2. लेकिन static चर के संदर्भ static बिना, आपके पास static विधियां हो सकती हैं। static चर का जिक्र किए बिना सहायक तरीके java.lang.Math जैसे कुछ जावा वर्गों में पाया जा सकता है

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

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

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

ओरेकल दस्तावेज page अधिक जानकारी प्रदान करता है।

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

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

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

जैसे

Obj x = new Obj();
x.someMethod

या

Obj.someMethod

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

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


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


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

तो एक कक्षा Car आपके पास एक विधि double convertMpgToKpl(double mpg) हो सकता है double convertMpgToKpl(double mpg) जो स्थैतिक होगा, क्योंकि कोई यह जानना चाहता है कि 35mpg क्या बदलता है, भले ही किसी ने कभी कार नहीं बनाई हो। लेकिन void setMileage(double mpg) (जो एक विशेष कार की दक्षता सेट करता है) स्थिर नहीं हो सकता है क्योंकि किसी भी कार का निर्माण करने से पहले विधि को कॉल करने के लिए यह अकल्पनीय है।

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


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

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

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

यदि निम्न स्थितियां लागू होती हैं, तो अपनी विधि स्थिर बनाएं:

  1. आपकी विधि एक सामान्य कार्यक्षमता करती है जिसे नियमित रूप से पूरे एप्लिकेशन में उपयोग किया जाता है।
  2. आपकी विधि इंस्टेंस चर का उपयोग नहीं करती है।
  3. आपकी विधि तर्क के रूप में इनपुट स्वीकार करती है, कुछ सामान्य कार्यक्षमता करें और फिर कुछ परिणाम लौटाएं।

पीएस: यह उल्लेख करना महत्वपूर्ण है कि एक स्थिर विधि का नकल करने के लिए यह बहुत मुश्किल है या यहां तक ​​कि (संभव नहीं), मॉकिंग कुछ तरीकों के व्यवसाय को नकली करने के लिए यूनिट परीक्षण में उपयोग की जाने वाली एक तंत्र है।

अधिक जानकारी के लिए, जावा में स्टेटिक कीवर्ड जांचें


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

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

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


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


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

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

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

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

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


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

  1. एक स्थिर विधि कक्षा के उद्देश्य के बजाय कक्षा से संबंधित है।
  2. कक्षा के उदाहरण बनाने की आवश्यकता के बिना एक स्थिर विधि का आह्वान किया गया।
  3. स्थैतिक विधि स्थैतिक डेटा सदस्य तक पहुंच सकती है और इसका मूल्य बदल सकती है।

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

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();  
}  }

ओ / पी: 111 भारतीय बीबीडीआईटी 222 अमेरिकी बीबीडीआईटी 333 चीन बीबीडीआईटी


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

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

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


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

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

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


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

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


स्टेटिक: Obj.someMethod

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





static-methods