2009-02-24 19 views
10

जावा की enum सुविधा द्वारा प्रदान की गई वाक्यविन्यास चीनी कभी-कभी थोड़ा उलझन में हो सकती है। इस उदाहरण है, जो संकलन नहीं है पर विचार करें:enum परिभाषा में स्टेटिक संदर्भ

public enum TestEnum { 

    FOO("foo") { 
     public void foo() { 
      helper(); // <- compiler error 
     } 
    }; 

    String name; 
    TestEnum(String name) { 
     this.name = name; 
    } 

    public abstract void foo(); 

    private void helper(){ 
     // do stuff (using this.name, so must not be static) 
    } 
} 

किसी को भी व्याख्या कर सकते हैं क्यों संकलक का कहना है

गैर स्थिर विधि 'सहायक()' एक स्थिर संदर्भ से संदर्भित नहीं किया जा सकता

यह संदर्भ स्थिर कैसे है?

आप इस this.helper() (यहाँ एक भ्रामक बात है?: यदि हम वास्तव में एक "स्थिर संदर्भ" में संकलक की तरह चलता है, कैसे "this" काम कर सकते हैं) के लिए कॉल को बदलने के द्वारा संकलित कर सकते हैं या द्वारा डिफ़ॉल्ट स्तर पर helper() की दृश्यता में वृद्धि। तुम किसे वरीयता दोगे? इसके अलावा, एक बेहतर प्रश्न शीर्षक का सुझाव देने के लिए स्वतंत्र महसूस करें :-)

संपादित करें: मुझे some discussion about this मिला - लेकिन कोई वास्तविक जवाब नहीं मिला। मेरे सहयोगी इस तथ्य को सोचते हैं कि this.helper() काम वास्तव में एक कंपाइलर बग है। और वास्तव में नए जावा संस्करणों के साथ यह काम करने के लिए प्रतीत होता है (हालांकि super.helper() करता है): "प्रतीक सहायक()" नहीं मिल सकता है "। (हालांकि कुछ अजीब चल रहा है: विभिन्न जावा संस्करणों के साथ प्रयास करने के बाद मुझे this.helper() को किसी भी के साथ फिर से संकलित करने के लिए नहीं मिल सकता है ...)

उत्तर

0

इस समस्या का जिक्र करते हुए article है, दुर्भाग्यवश यह जर्मन में है। शायद आप अभी भी कुछ उपयोगी जानकारी निकाल सकते हैं।

संपादित करें: आपकी ओर से कुछ अलग समस्या होने लगती है। मैं अभी भी आपके उदाहरण के व्यवहार को समझ नहीं पा रहा हूं, जिसे मैं यहां भी देखता हूं।

3

ऐसा कुछ जावा पज़लर पुस्तक में शामिल है। आईआईआरसी, बाहरी वर्ग संदर्भ हमेशा सुपर क्लास से पहले देखा जाता है। इस मामले में सहायक पाया जाता है। लेकिन हम एक स्थिर संदर्भ में मूल्य का निर्माण कर रहे हैं (प्रभावी रूप से private static finalFOO से पहले प्रभावी है)। इसलिए त्रुटि।

super.helper(); आज़माएं।

+0

मेरे पास पुस्तक है; आप किस पहेली का मतलब है? (मुझे इसे जल्दी से नहीं मिला।) – Jonik

+0

पुस्तक की मेरी प्रतियां कहीं और बक्से में पैक की गई हैं, इसलिए मुझे कोई जानकारी नहीं है। –

2

अगर मैं अपने वर्ग संरचना में अपने enum का अनुवाद इसे इस तरह लगभग दिखेगा:

public abstract class TestEnum { 

    public static final TestEnum FOO = new FOO("foo") { 
    public void foo() { 
     helper(); // <- compiler error 
    } 
}; 

    String name; 
    TestEnum(String name) { 
     this.name = name; 
    } 

    public abstract void foo(); 

    private void helper(){ 
    // do stuff (using this.name, so must not be static) 
    } 

}

उदाहरण FOO एक anynomous वर्ग कि TestEnum फैली हुई है। यही कारण है कि मेरा मानना ​​है कि आप सहायक() तक नहीं पहुंच सकते हैं, क्योंकि यह निजी है। तो यह .helper() शायद काम नहीं करना चाहिए। मुझे यकीन नहीं है कि क्यों super.helper() काम करता है, लेकिन शायद enum आपको माता-पिता को निजी पहुंच प्रदान करता है।

स्थिर संदर्भ त्रुटि के लिए, मैं सहमत हूं कि त्रुटि संदेश समझ में नहीं आता है।

+0

नाइटपिक: "नया फूड" के साथ आपका मतलब "नया टेस्टएनम" था? – Jonik

+0

हाँ भी पकड़ा .. धन्यवाद – richs

8

त्रुटि संदेश भ्रामक है, बस helper सुरक्षित करें और यह काम करेगा।

protected void helper(){ 
    // can be called from subclasses (such as FOO) since it is not private 
} 
1

आप प्रत्येक enum निरंतर enum वर्ग के उप-वर्ग के एकमात्र उदाहरण के रूप में सोच सकते हैं।"नियमित" वर्गों की तरह, enum "उप-वर्ग" enum "सुपर-क्लास" के निजी सदस्यों तक नहीं पहुंच सकता है। (मैं "इस।" काम के आसपास पुन: नहीं कर सकते कि आप का उल्लेख।)

एक उचित समाधान परिवर्तन करने के लिए संरक्षित enum निरंतर तक पहुंच प्रदान करना निजीकरने से विधि का उपयोग कर सकते है " उप-वर्गों। "

बेहतर प्रश्न शीर्षक सुझाव: "जावा निजी enum विधि?" या सिर्फ "निजी enum विधि" (जावा टैग जावा-नेस का ख्याल रखना)

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