2010-04-23 12 views
5

यदि मैं जावा में किसी वर्ग का उदाहरण बनाता हूं, तो यह .method() का उपयोग करने के बजाय, उसी वर्ग की स्थैतिक विधि को कॉल करना बेहतर क्यों है?विधि की कक्षा के उदाहरण के भीतर स्थैतिक रूप से स्थैतिक विधि को कॉल करना बेहतर क्यों है?

मुझे ग्रहण से चेतावनी मिलती है जब मैं इस विधि के माध्यम से कस्टम क्लास के कन्स्ट्रक्टर के भीतर स्थिर विधि staticMethod() को कॉल करने का प्रयास करता हूं।

public MyClass() { this.staticMethod(); } 

बनाम

public MyClass() { MyClass.staticMethod(); } 

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

संपादित करें:

मैं क्या कर रहा हूँ सुनवाई का सार है कि यह मुख्य रूप से पठनीयता की वजह से बुरा व्यवहार है, और जाहिर है तो है। मैं वास्तव में पूछने की कोशिश कर रहा था (यद्यपि बहुत स्पष्ट रूप से नहीं) यह था कि MyClass.staticMethod() या this.staticMethod() को कॉल करने के बीच 'संकलन', यदि कोई हो, तो क्या अंतर है।

उत्तर

6

MyClass.staticMethod() यह स्पष्ट करता है कि आप एक स्थिर (गैर-ओवरराइड करने योग्य) विधि को कॉल कर रहे हैं।

यह .staticMethod() पाठक को यह सोचने में गुमराह करता है कि यह एक उदाहरण विधि है।

staticMethod() भी भ्रामक पक्ष पर है (हालांकि मैं इसे सामान्य रूप से करता हूं)।

यदि आप लोगों को अपने कोड को अपरिचित के रूप में पढ़ने के बारे में सोचते हैं तो आप कोड को स्पष्ट करने की कोशिश करते हैं, और यह एक ऐसा मामला है जहां कोड example.method के बजाय ClassName.method होने से स्पष्ट है।

2

क्योंकि this. आमतौर पर उदाहरण विधियों के संदर्भ में है, इसलिए, ऐसा करना एक बुरा विचार है।

11

स्टेटिक तरीकों वर्ग का एक उदाहरण से जुड़ा नहीं है, तो यह कम समझ में आता है कि यह एक this से कॉल करने के लिए की तुलना में, भी Class.staticMethod() से यह कॉल करने के लिए और अधिक पठनीय।

3

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

प्रारंभ करने में अपनी जरूरत तो स्थिर वस्तुओं

private static List l = new ArrayList(); static { l.add("something"); } 

का उपयोग आप अभी भी इसे कहते हैं की जरूरत है इसकी पूरी तरह से

(कोई ग्रहण चेतावनी) इस तरह अपने स्थानीय वर्ग के नाम लगाकर, बिना स्थानीय स्थिर तरीकों कॉल करने के लिए कानूनी
public MyClass() { staticMethod(); } 
5

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

नीचे कोड में, यह पूरी तरह से स्पष्ट है कि b.test() वापस जाने के लिए जा रहा है नहीं है 'ए' यदि आप एक गैर स्थैतिक विधि के बहुरूपता की उम्मीद कर रहे हैं:

public class TestStaticOverride 
{ 
    public static void main(String[] args) 
    { 
    A b = new B(); 
    System.out.println("Calling b.test(): " + b.test()); 
    } 

    private static class A 
    { 
    public static String test() { return "A"; } 
    } 

    private static class B extends A 
    { 
    public static String test() { return "B"; } 
    } 
} 

आप B b = new B(); करने के लिए कोड को बदलते हैं यह "बी" प्रिंट करेगा।

+0

आप स्थिर तरीकों को ओवरराइड नहीं है (यह कभी एक अच्छा विचार "ओवरराइड" करने के लिए स्थिर तरीकों शायद एक और दिन के लिए एक चर्चा है ... चाहे), तो आप उन्हें छिपाने। ओवरराइडिंग पॉलीमोर्फिज्म का तात्पर्य है, जिसे आप स्थिर तरीकों से नहीं प्राप्त करते हैं। – TofuBeer

+0

@ टोफूबीर धन्यवाद, मैं अपनी शब्दावली में पर्याप्त सटीक नहीं था। किसी स्थिर विधि पर 'इस' का उपयोग करने वाले किसी के परिप्रेक्ष्य से, यह पॉलिमॉर्फिज्म के लिए कुछ प्रकार का इरादा बता सकता है, जो काम नहीं करेगा। – Ash

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