2009-10-29 9 views
38

जावा में एक वर्ग के एक निजी स्थिर सदस्य को कैसे प्रारंभ करें।स्थैतिक चर प्रारंभिक जावा

की कोशिश कर रहा है:

public class A { 
    private static B b = null; 
    public A() { 
     if (b == null) 
     b = new B(); 
    } 

    void f1() { 
     b.func(); 
    } 
} 

लेकिन कक्षा एक की एक दूसरी वस्तु बनाने और फिर f1() कॉल पर, मैं एक नल पॉइंटर एक्सेप्शन मिलता है।

+0

आपको सार्वजनिक कन्स्ट्रक्टर –

+0

ठीक टाइपिंग गलती का उपयोग करना चाहिए। –

+1

कोड की कौन सी रेखा आपको नल पॉइंटर अपवाद मिलता है? –

उत्तर

68

पसंदीदा प्रारंभ करने में स्थिर सदस्यों को या तो (जैसा कि पहले उल्लेख किया है) कर रहे हैं

private static final B a = new B(); // consider making it final too 

या अधिक जटिल प्रवर्तन कोड के लिए तरीकों से आप एक स्थिर प्रारंभकर्ता ब्लॉक का उपयोग कर सकते हैं:

private static final B a; 

static { 
    a = new B(); 
} 
+2

मैंने एक स्थिर प्रारंभकर्ता ब्लॉक का उपयोग किया क्योंकि बी के निर्माता ने अपवाद फेंकता है। अभी भी मुझे एक ही त्रुटि मिलती है। लाइब्रेरी फ़ंक्शन पर पहला कॉल काम करता है लेकिन दूसरा नहीं। –

+2

जैसा कि मैंने देखा है कि स्थिर सदस्यों को शुरू करने का पसंदीदा तरीका वास्तविक स्थिति पर निर्भर करता है। सॉफ़्टवेयर जो इस पैटर्न के माध्यम से * सभी * स्थिर सदस्यों को बनाता है, एप्लिकेशन स्टार्टअप के दौरान प्रदर्शन हिट करता है। गैर-तुच्छ स्थितियों के लिए मैं इसी कारण से आलसी प्रारंभिक पैटर्न का पक्ष लेता हूं। – rsp

+1

@rsp: आप अपनी प्रदर्शन चिंता के साथ सही हैं (सही होने के लिए यह स्टार्टअप पर नहीं है, लेकिन जब कक्षा लोड की जाती है - जो वही हो सकती है लेकिन आवश्यकता नहीं है)। मैं अभी भी प्रारंभिक कार्य करने के रूप में पसंदीदा स्थिर सदस्य को प्रारंभ करने के इस तरीके पर विचार करता हूं, आलस्य कोड को जटिलता जोड़ता है - अच्छे कारण को छोड़कर इसे टालना चाहिए। प्रदर्शन एक ऐसा कारण हो सकता है। – sfussenegger

4

आपका कोड काम करना चाहिए। क्या आप वाकई अपना सटीक कोड पोस्ट कर रहे हैं?


तुम भी इसे और अधिक सीधे प्रारंभ कर सकते हैं:

public class A { 

     private static B b = new B(); 

     A() { 
     } 

     void f1() { 
     b.func(); 
     } 
    }