2010-07-07 33 views
12

हमारा एप्लिकेशन प्रारंभिक कोड का उपयोग कर रहा है जो आदेश स्थिर कोड पर निर्भर करता है और मुझे आश्चर्य है कि यह आदेश सभी JVMs में संगत होगा या नहीं। (मेरे पर्यावरण पर)जब हम पहली बार कक्षा का उपयोग करते हैं तो स्थिर कोड हमेशा निष्पादित होता है?

 
init_value 
init_value 

और


public class Main { 

    static String staticVar = "init_value"; 

    public static void main(String[] args) { 

     // System.out.println(A.staticVar); 
     staticVar = "mainValue"; 
     System.out.println(A.staticVar); 
    } 
} 

public class A { 
    static String staticVar = Main.staticVar; 
} 

दे देंगे:


public class Main { 

    static String staticVar = "init_value"; 

    public static void main(String[] args) { 

     System.out.println(A.staticVar); 
     staticVar = "mainValue"; 
     System.out.println(A.staticVar); 
    } 
} 

public class A { 
    static String staticVar = Main.staticVar; 
} 

दे देंगे:

यहाँ मैं क्या मतलब का एक नमूना है

mainValue

संक्षेप में, सभी जेवीएम में, स्थिर कोड हमेशा निष्पादित होता है जब हम पहली बार कक्षा का उपयोग करते हैं?

उत्तर

18

संपादित करें: नीचे दिए गए सभी आश्वासनों के बावजूद, यदि आप इस तरह की चीज़ पर भरोसा करने के बारे में सोच रहे हैं, तो मैं आपके कोड को दोबारा करने के लिए कड़ी मेहनत करूँगा ताकि यह फसल न हो। जबकि यह काम करने की गारंटी है, यह भी आपके कोड को बहुत भंगुर बनाने की संभावना है। तथ्य यह है कि स्थैतिक प्रारंभकर्ताओं को "अदृश्य" कहा जाता है, जिससे उन्हें तर्क और डीबग करने के लिए अपेक्षाकृत कठिन बना दिया जाता है।


हां, यह भाषा विनिर्देशन द्वारा गारंटीकृत है। कल्पना की section 8.7 से: जब वर्ग आरंभ नहीं हो जाता

किसी भी स्थिर initializers एक वर्ग में घोषित क्रियान्वित कर रहे हैं और वर्ग चर के लिए किसी भी क्षेत्र initializers (§8.3.2) के साथ एक साथ, वर्ग प्रारंभ करने में इस्तेमाल किया जा सकता कक्षा के चर (§12.4)।

StaticInitializer: staticब्लॉक

यह (§14.1, §15.6) एक जाँच अपवाद के साथ एक स्थिर प्रारंभकर्ता के लिए एक संकलन समय त्रुटि अचानक पूरा करने के लिए सक्षम होने के लिए है (§11.2)। यह एक संकलित-समय त्रुटि है यदि एक स्थिर प्रारंभकर्ता सामान्य रूप से पूरा नहीं कर सकता (§14.21)।

स्थैतिक प्रारंभकर्ता और कक्षा परिवर्तक प्रारंभिक पाठकों के क्रम में निष्पादित किए जाते हैं।

और section 12.4 से:

एक वर्ग के प्रारंभ स्थिर क्षेत्रों वर्ग में घोषित के लिए अपने स्थिर initializers और initializers को क्रियान्वित करने के होते हैं। इंटरफ़ेस में को निष्पादित करने वाले फ़ील्ड के प्रारंभकर्ताओं को इंटरफ़ेस में घोषित किया गया है।

से पहले एक वर्ग प्रारंभ है, इसका प्रत्यक्ष सुपर क्लास प्रारंभ किया जाना चाहिए, लेकिन इंटरफेस वर्ग द्वारा कार्यान्वित प्रारंभ करने की आवश्यकता नहीं। इसी प्रकार, इंटरफ़ेस के superinterfaces इंटरफ़ेस प्रारंभ होने से पहले प्रारंभ नहीं किया जाना चाहिए।

एक वर्ग या इंटरफ़ेस प्रकार टी निम्नलिखित में से किसी एक का पहली घटना से ठीक पहले प्रारंभ किया जाएगा:

  • टी एक वर्ग और टी का एक उदाहरण है है बनाया।
  • टी एक वर्ग है और टी द्वारा घोषित एक स्थिर विधि लागू की गई है।
  • ए टी द्वारा घोषित स्थिर क्षेत्र असाइन किया गया है।
  • टी द्वारा घोषित एक स्थिर क्षेत्र का उपयोग किया जाता है और फ़ील्ड स्थिर चर (§4.12.4) नहीं है।
  • टी एक शीर्ष स्तर के वर्ग है, और एक ज़ोर बयान (§14.10) lexically
+0

यह स्वीकार किया गया जवाब हमेशा जॉन से आ रहा है? ;) ऐसा लगता है कि इस साइट पर उसके पास कुछ प्रकार का अनुचित लाभ है;) –

4

स्टेटिक initialisers (जैसे अपने staticVar घोषणाओं) नेस्ट हमेशा क्रियान्वित कर रहे हैं जब आप पहली बार के लिए एक वर्ग का उपयोग पहर।

स्टेटिक विधियों को केवल तभी निष्पादित किया जाता है जब उन्हें बुलाया जाता है। आपके मामले में, ऐसा इसलिए हो रहा है क्योंकि स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) आपके आवेदन का प्रवेश बिंदु है। लेकिन अगर आपने एक अलग स्थैतिक विधि परिभाषित की है तो इसे नहीं कहा जाएगा।

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

static { 
    // some initialisation code here 
} 
0

हाँ, मुझे विश्वास है कि परिभाषा के आधार पर यह होगा।

0

स्टेटिक ब्लॉक हमेशा पहले न सिर्फ पहली बार चलेंगे ... किसी भी कोड ब्लॉक, JVM execute the static code block first को क्रियान्वित करने से पहले, और उसके बाद ही यह के रूप में यह डिजाइन किया गया है कोड ब्लॉक चलाने ...

2

एक उद्धरण

एक वर्ग स्थिर क्षेत्रों वर्ग में घोषित के लिए अपने स्थिर initializers और initializers को क्रियान्वित करने के होते हैं का प्रारंभ: जावा विनिर्देश से। इंटरफ़ेस में को निष्पादित करने वाले फ़ील्ड के प्रारंभकर्ताओं को इंटरफ़ेस में घोषित किया गया है।

1

हां, Java Language Specification के अनुसार स्थिर कोड हमेशा सभी (अनुपालन) JVM के समान क्रम में निष्पादित किया जाता है।

8.7 Static Initializers

स्थिर initializers और वर्ग चर initializers शाब्दिक क्रम में क्रियान्वित कर रहे हैं।

+0

यह स्थिर प्रारंभकर्ताओं के भीतर आदेश दिखाता है - लेकिन यह इस बात का जवाब नहीं देता है कि कक्षा का उपयोग होने पर कोड हमेशा निष्पादित होता है या नहीं। –

1

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

+0

yuck के लिए +1 ... आईएमओ इस तरह के एक प्रारंभकर्ता (केवल) इसे देखने के लिए एक अच्छा विचार है/दिखाने के लिए। –

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

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