2011-10-25 14 views
9

हाल ही में एक सवाल में, किसी स्थिर तरीकों के बारे में पूछा और जवाब में से एक ने कहा कि आम तौर पर आप की तरह कुछ के साथ उन्हें फोन:किसी ऑब्जेक्ट "खराब फॉर्म" के माध्यम से स्थिर विधियों को कॉल कर रहा है? क्यूं कर?

MyClassName.myStaticMethod(); 

पर यह भी कहा कि है कि आप भी साथ एक वस्तु के माध्यम से यह कह सकते हैं टिप्पणियां :

MyClassName myVar; 
myVar.myStaticMethod(); 

लेकिन यह खराब रूप माना जाता था।

अब मुझे लगता है कि ऐसा करने वास्तव में मेरे जीवन बनाने के आसान तो मैं नहीं है सकते हैं में चिंता करने की क्या स्थिर है के बारे में या नहीं (क)

कोई वस्तु के माध्यम से स्थैतिक कार्यों को कॉल करने में कुछ समस्या है? जाहिर है आप एक ब्रांड नई वस्तु बनाने चाहेगा नहीं बस इसे कहते हैं:

Integer xyzzy; 
int plugh = xyzzy.parseInt ("42", 10); 

लेकिन, अगर आप पहले से ही वांछित प्रकार का ऑब्जेक्ट है, वहाँ इसे प्रयोग में एक समस्या है?


(क) जाहिर है, मैं के साथ एक गैर स्थैतिक विधि कॉल नहीं कर सकते हैं:

MyClassName.myNonStaticMethod(); 

लेकिन यह है कि इस मुद्दे को मैं यहाँ के बारे में पूछ रहा हूँ नहीं है।

+1

जानकारी के लिए यह SO उत्तर देखें http://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of-an-instance-an-error-for-the -जावा-सह/610674 # 610674 –

+0

जब मैं कोड पढ़ता हूं और एक विधि के लिए एक कॉल है, तो मेरे लिए यह ** अत्यधिक ** प्रासंगिक है कि तुरंत यह बताने में सक्षम हो कि वह कॉल ऑब्जेक्ट की स्थिति को पढ़ और न संशोधित नहीं कर सकता यह इससे संबंधित है। 'MyClassName.myStaticMethod() के साथ; 'इसके बारे में एक दूसरे के लिए आश्चर्य की आवश्यकता भी नहीं है। 'MyVar.myStaticMethod(); 'आपको विधि का कोड देखना होगा, और आप हमेशा _all_ कॉल के लिए इस संदेह में रहेंगे। बेशक अलग-अलग आईडीई इस जानकारी को पुनर्प्राप्त करने में आसान बना सकते हैं (जावाडोक टूलटिप्स, सिंटैक्स हाइलाइटिंग इत्यादि) लेकिन मैं इस पर भरोसा नहीं करता कि कोड कैसे लिखना है। – SantiBailors

उत्तर

14

बुरा प्रपत्र टिप्पणी जावा

के लिए कोडिंग कन्वेंशनों से आता है इसके लिए http://www.oracle.com/technetwork/java/codeconventions-137265.html#587

कारण देखो, अगर आप इसके बारे में सोचते हैं, कि विधि, स्थिर किया जा रहा है, नहीं के हैं करता है कोई विशेष वस्तु। चूंकि यह कक्षा से संबंधित है, तो आप एक विशेष वस्तु को ऐसी विशेष स्थिति में क्यों बढ़ाएंगे जो ऐसा लगता है कि यह एक विधि है?

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

इस बारे में प्रोग्रामर आपके लिए प्रोग्रामर को आसान बनाता है, इसे चारों ओर घुमाएं और पूछें कि पाठक पर जीवन को आसान बनाता है? दो प्रकार के तरीके हैं: उदाहरण और स्थैतिक। जब आप C.m अभिव्यक्ति देखते हैं और आपको पता है कि C एक वर्ग है, तो आप जानते हैं कि m एक स्थिर विधि होना चाहिए। जब आप x.m देखते हैं (जहां x एक उदाहरण है) तो आप यह नहीं बता सकते हैं, लेकिन यह एक उदाहरण विधि की तरह दिखता है और इसलिए अधिकांश लोग केवल उदाहरण विधियों के लिए इस वाक्यविन्यास को सुरक्षित रखते हैं।

3

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

+1

यदि वह "सुपर भ्रमित" एक पन था, तो मुझे आना होगा और आपको थोड़ा सा थप्पड़ मारना होगा :-) – paxdiablo

+0

@ पक्सडीब्लो मैं चाहता हूं कि मैंने किया ... यह बहुत अच्छा होता। – bdares

4

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

20

मेरी राय में, वास्तविक उपयोग केस जो इसे इतना अपठनीय बनाता है, ऐसा कुछ है। नीचे कोड क्या प्रिंट करता है?

//in a main method somewhere 
Super instance = new Sub(); 
instance.method(); 

//... 
public class Super { 
    public static void method() { 
     System.out.println("Super"); 
    } 
} 

public class Sub extends Super { 
    public static void method() { 
     System.out.println("Sub"); 
    } 
} 

उत्तर यह है कि यह "सुपर" प्रिंट करता है, क्योंकि स्थैतिक विधियां आभासी नहीं हैं। भले ही instance है -Sub, संकलक केवल वेरिएबल के प्रकार पर जा सकता है जो Super है। हालांकि, की बजाय instance के माध्यम से विधि को कॉल करके, आप संक्षेप में यह कह रहे हैं कि यह आभासी होगा।

वास्तव में, instance.method() पढ़ने वाले डेवलपर को विधि (इसकी हस्ताक्षर) की घोषणा को देखना होगा कि यह वास्तव में किस विधि को बुलाया जा रहा है। आप उल्लेख

मुझे लगता है कि ऐसा करने वास्तव में मेरे जीवन को आसान बना सकते हैं तो मैं या नहीं क्या स्थिर है के बारे में चिंता

की जरूरत नहीं है लेकिन संदर्भ उपरोक्त मामले में वास्तव में बहुत महत्वपूर्ण है !

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

+1

+1 सहमत था कि यह भी एक गलती थी (आईएमएचओ)। और एक अच्छा उदाहरण बीटीडब्ल्यू। –

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

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