2012-12-01 6 views
5

क्या बीच का अंतर है:स्टेटिक प्रारंभिक?

private static Object myVar = new Object(); 

और: दोनों मामले मैं अंत में

private static Object myVar2; 

static{ 
    myVar2 = new Object(); 
} 

एक initilized स्थिर चर

+6

एक अन्य एक से कम वर्बोज़ है। दूसरे का उपयोग केवल तभी करें जब आप पहले का उपयोग नहीं कर सकते। –

+0

बिल्कुल कोई फर्क नहीं पड़ता। –

उत्तर

8

आप एक दूसरे अगर की initialisation बेहतर उपयोग कर सकते हैं आपकी स्थिर और शायद अंतिम वस्तु अधिक जटिल है।

उदा .:

static final MyClass something; 

static { 
    Config conf=SettingsManager.getSettings(); 
    MyClass obj=MyClassFactory.getInstance(conf); 
    obj.setVodoo(true); 
    something=obj; 
} 
6

अपने उदाहरण में कोई अंतर नहीं है और संकलित बाईटकोड वास्तव में या बहुत लगभग एक ही खत्म हो जाएगा। स्टेटिक प्रारंभिक कभी-कभी उपयोगी होते हैं, लेकिन अधिक बार दुरुपयोग किया जाता है। लक्ष्य एक भी स्थिर क्षेत्र को भरने के लिए है, तो एक स्थिर विधि कि initialized ऑब्जेक्ट और स्थिर क्षेत्र घोषणा के अंदर है कि विधि कॉल लिखें।

1

आप स्थिर initialiser ब्लॉक का उपयोग कर सकते हैं यदि आपके स्थिर वस्तु बनाने अधिक जटिल है। उदाहरण के लिए, यह setters बुला आवश्यकता हो सकती है, या सेट अप किया जा रहा है एक माध्यमिक मध्यवर्ती वस्तु पर।

static { 
    SomeConfig config = new SomeConfig(); 
    config.setMaxSize(10); 
    config.setMinSize(1); 
    YourObject object = new YourObject(config); 
} 
0

दोनों बिल्कुल वर्ग फ़ाइल की सामग्री से स्पष्ट रूप में एक ही कर रहे हैं:

public class Test extends java.lang.Object{ 
    public Test(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

static {}; 
    Code: 
    0: new  #2; //class java/lang/Object 
    3: dup 
    4: invokespecial #1; //Method java/lang/Object."<init>":()V 
    7: putstatic  #3; //Field myVar2:Ljava/lang/Object; 
    10: return 

} 

आप या तो मामले में एक ही बाईटकोड मिल जाएगा। मैंने Test.java फ़ाइल में उपरोक्त विकल्पों को डालकर बाइटकोड उत्पन्न किया।