2012-08-02 22 views
8

यह निर्माता के लिए प्रभावी जावा से है:निष्पादन आदेश

ऑपरेशन स्थिरांक stringToEnum नक्शा में एक स्थिर ब्लॉक कि के बाद चलता है से डाल रहे हैं
// Implementing a fromString method on an enum type 
    private static final Map<String, Operation> stringToEnum 
     = new HashMap<String, Operation>(); 

    static { // Initialize map from constant name to enum constant 
    for (Operation op : values()) 
     stringToEnum.put(op.toString(), op); 
    } 

    // Returns Operation for string, or null if string is invalid 
    public static Operation fromString(String symbol) { 
    return stringToEnum.get(symbol); 
    } 

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

मेरा प्रश्न लाइन के बारे में है:

"ध्यान दें कि ऑपरेशन स्थिरांक एक स्थिर ब्लॉक के बाद स्थिरांक नहीं बनाई गई है चलाता है कि से stringToEnum नक्शा में डाल रहे हैं"।

मैंने सोचा कि रचनाकार रन चलाने से पहले स्थैतिक ब्लॉक निष्पादित हो जाता है। वास्तव में कक्षा लोड समय के दौरान निष्पादित किया जाता है।

मुझे यहां क्या याद आ रही है?

+0

देखें http://stackoverflow.com/questions/3028219/are-there-any-guarantees-in-jls-about-order-of-execution-static - प्रारंभिकरण-बी –

उत्तर

11

मैं आपके प्रश्न को समझता हूं: क्यों एक गारंटी है कि स्थिर ब्लॉक चलाने से पहले enum स्थिरांक शुरू किया जाएगा। जवाब JLS में दी गई है, और एक विशिष्ट उदाहरण निम्नलिखित विवरण के साथ #8.9.2.1 में दी गई है,:

स्थिर प्रारंभ ऊपर से नीचे होता है।

और enums स्थिरांक निश्चित रूप से अंतिम स्थिर हैं और स्थिर प्रारंभिक ब्लॉक से पहले घोषित किए जाते हैं।

संपादित

व्यवहार एक सामान्य वर्ग से अलग नहीं है। प्रिंट नीचे कोड:

In constructor: PLUS 
PLUS == null MINUS == null 

In constructor: MINUS 
PLUS != null MINUS == null 

In static initialiser 
PLUS != null MINUS != null 

In constructor: after static 
PLUS != null MINUS != null 
public class Operation { 

    private final static Operation PLUS = new Operation("PLUS"); 
    private final static Operation MINUS = new Operation("MINUS"); 

    static { 
     System.out.println("In static initialiser"); 
     System.out.print("PLUS = " + PLUS); 
     System.out.println("\tMINUS = " + MINUS); 
    } 

    public Operation(String s) { 
     System.out.println("In constructor: " + s); 
     System.out.print("PLUS = " + PLUS); 
     System.out.println("\tMINUS = " + MINUS); 
    } 

    public static void main(String[] args) { 
     Operation afterStatic = new Operation ("after static"); 
    }  
} 
+0

कहता है कि ऑपरेशन कैलकुलेटर के संचालन का प्रतिनिधित्व करता है। और स्थिरांक (प्लस, मिनस, डिवाइड, मल्टीप्ली) केवल कन्स्ट्रक्टर चलाने के बाद ही बनाए जाएंगे। इसलिए मैं उलझन में हूं कि कन्स्ट्रेंट को कन्स्ट्रक्टर चलाने से पहले कैसे शुरू किया जा सकता है।स्थिर स्थिर अंतिम फ़ील्ड जो स्थिरांक धारण करते हैं उन्हें कन्स्ट्रक्टर के समक्ष बनाया जा सकता है लेकिन उन्हें केवल कन्स्ट्रक्टर चलाने के बाद ही असाइन किया जा सकता है। – Geek

+1

प्रत्येक निरंतर (प्लस, MINUS ...) को उनके संबंधित कन्स्ट्रक्टर चलाने के बाद शुरू किया जाएगा। निष्पादन का आदेश, यदि आप चाहते हैं, तो होगा: 'प्लस = नया ऑपरेशन (...); MINUS = नया ऑपरेशन (...); ...; स्थैतिक ब्लॉक ' – assylias

+0

यही कारण है कि ब्लॉच का कहना है कि यदि आप कन्स्ट्रक्टर से मानचित्र को पॉप्युलेट करने का प्रयास करते हैं क्योंकि सभी रचनाकारों ने चलने तक स्थिरांक शुरू नहीं किए हैं। – assylias

0

Operation स्थिरांक स्थिर क्रम में स्थिर ब्लॉक में बनाए गए स्थिर क्षेत्र हैं।

static { 
    // instantiate enum instances here 
    ... 
    // Initialize map from constant name to enum constant  
    for (Operation op : values())  
     stringToEnum.put(op.toString(), op); 
} 
0

static ब्लॉक उपस्थिति (आप कई स्थिर ब्लॉक हो सकता है), के क्रम में निष्पादित जब वर्ग लोडर, वर्ग को लोड करता है जैसे। यह निर्माता से पहले चलता है।

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