2012-11-23 13 views
17

संभव डुप्लिकेट:
Why can’t enum’s constructor access static fields?क्यों enum निर्माता स्थिर क्षेत्र तक नहीं पहुँच सकता

enum Test { 
    e1,e2;  

    int i=0; 
    static int j=5; 

    Test(){ 
    System.out.println(i+" "+j); 
    } 
} 

उपरोक्त कोड में निर्माता उदाहरण चर नहीं बल्कि स्थिर चर जम्मू तक पहुँच सकते हैं

मैंने उत्तर को अन्य लेखक से संबंधित उत्तर पढ़ा है, सभी ई 1 और ई 2 कह रहे हैं जे (स्थिर क्षेत्र) के प्रारंभ से पहले शुरू किया गया, लेकिन जावा स्पेक के अनुसार सभी स्थैतिक क्षेत्र प्रारंभिक रूप से जब कक्षा को स्मृति में लोड किया गया था, जो कि कन्स्ट्रक्टर के चलने से पहले है। तो टेस्ट() कन्स्ट्रक्टर चलाने से पहले स्थिर चर जे को प्रारंभ किया जाना चाहिए। मैं प्रतिबंध को समझने में सक्षम नहीं हूं, क्या कोई भी शरीर मुझे समझ सकता है। मैंने पहले से ही Why can't enum's constructor access static fields? प्रश्नों का उत्तर पढ़ा है, लेकिन मुझे जवाब से खुश नहीं है: - स्थिर फ़ील्ड को शुरू करने से पहले निर्माता को बुलाया जाता है।

अगर enum की तरह एक साधारण वर्ग के साथ एक और उदाहरण लेते मान लीजिए

class Test{ 
    public static final Test t=new Test(); 
    static int a=5; 

    Test(){ 
    System.out.println(a); 
    } 

    public static void main(String[] args) { 
    } 
} 

यहाँ तर्क निर्माता स्थिर क्षेत्र के प्रारंभ से पहले चलेंगे और यह भी चल रहा है के रूप में यह प्रिंट 0 है (JVM के रूप में किया था के अनुसार initilization)। लेकिन कोई संकलन त्रुटि या कोई रन टाइम समस्या नहीं है। तो क्यों एक ही चीज enum के साथ नहीं होती है।

+1

वास्तव में अच्छा सवाल है, मैं यह नहीं समझ सका कि यह क्यों है। जावा-कंपाइलर क्लास फ़ाइल को कैसे संकलित करता है इसके साथ कुछ हो सकता है। – Gerbrand

+1

मैं जावा विशेषज्ञ नहीं हूं, लेकिन अनिवार्य रूप से 'enum' के स्थिर सदस्यों के एक enum (' e1' और 'e2') के सदस्य नहीं हैं? और इस तरह, जब * वे * मूल्यों के साथ शुरू होते हैं, तो कन्स्ट्रक्टर को बुलाया जाना चाहिए। लेकिन 'जे' अभी तक शुरू नहीं किया गया होगा? –

+0

जावा में हर enum * java.lang.Enum' विस्तारित एक वर्ग है। यह 'java.lang.Enum' किसी अन्य * सामान्य * कक्षाओं द्वारा बढ़ाया नहीं जा सकता है। तो, आपका तर्क है कि "एनम की तरह एक साधारण वर्ग" अनुमानित उत्पादन उत्पन्न करता है अमान्य है। – Prasanth

उत्तर

2

समस्या यह है कि स्थिर क्षेत्रों के inicialization के दौरान enum के उदाहरण बनाए जाते हैं। और उन्होंने आपके स्थिर क्षेत्रों की शुरुआत से पहले बनाया था। वे स्थिर सरणी मानों और स्थिर रूप से सुलभ होने चाहिए, इसलिए यह समझ में आता है। और जैसा कि उत्तर में कहा गया है, "एनम के कन्स्ट्रक्टर स्थिर क्षेत्रों तक क्यों नहीं पहुंच सकते?", यह दुर्भाग्यपूर्ण है कि यह सभी उपयोगकर्ता परिभाषित स्थैतिक क्षेत्र inicialization से पहले होता है। लेकिन अगर इसे स्वैप किया गया था, तो आप स्थिर प्रारंभिकरण में enum उदाहरणों को प्राप्त नहीं कर पाएंगे, इसलिए इसे enum मानों के निर्माण से पहले और बाद में स्थिर ब्लॉक की अनुमति होगी।

मैं नहीं पता है समस्या यह है कि क्या क्योंकि enum मूल्यों की inicialization Enum वर्ग की चिंता का विषय है (और (इस तर्क Enum वर्ग में ही) में नहीं है, या क्योंकि आप enum मूल्यों से पहले स्थिर क्षेत्रों नहीं डाल सकते JVM द्वारा specialy संभाला।

ऐसा क्यों है कि जिस तरह से केवल कुछ ही लोगों को (जैसे। जोश बलोच और नील Gafter जो जावाडोक में enum के लेखकों के रूप में दिया गया है, और शायद कुछ अज्ञात अन्य)

6

जवाब कर सकते हैं जैसा कि आप कल्पना, तो यहां आपके enum वास्तव में होगा एक वर्ग के रूप में देखो, यह समझ में आता है:

public class Test { 
    // Imagine you cannot move these two statements: 
    public static final Test e1 = new Test(); 
    public static final Test e2 = new Test(); 

    int i=0; 
    static int j=5; 

    private Test(){ 
    System.out.println(i+ " " + j); 
    } 

    static int getJ() { 
    return j; 
    } 


    public static void main(String[] args) { 
    System.out.println(Test.getJ()); 
    } 
} 
,210

यह प्रिंट:

0 0 
0 0 
5 

आप एक ठोस उदाहरण (बजाय एक सैद्धांतिक एक) साझा कर सकते हैं, तो हमारा सुझाव सकता है कैसे स्थिर क्षेत्र सीमाओं के बावजूद, वांछित परिणाम प्राप्त करने कोड नया स्वरूप।

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