2009-06-08 3 views
9

मैं जावा में एक स्विच बयान है, एक Enum जो हमें IMyInterface.MyEnumenums पर जावा स्विच स्टेटमेंट में, जब मैं प्रत्येक मामले में अपने मूल्यों को अर्हता प्राप्त करता हूं तो मुझे संकलन त्रुटि क्यों मिल रही है? IMyInterface.MyEnum.MyValue, (हालांकि मैं IMyInterface छोड़ सकता है अगर मैं आयातित:

मेरे मामले में बयान से प्रत्येक

कॉल पर रूप है)।

हालांकि, कंपाइलर (जावा 6) एक त्रुटि फेंकता है: "योग्य केस लेबल IMyInterface.MyEnum.MyValue को unqalified enum स्थिर MyValue के साथ प्रतिस्थापित किया जाना चाहिए"।

मैं स्पष्ट रूप से ऐसा कर सकता हूं, लेकिन मेरे जीवन के लिए मुझे समझ में नहीं आता कि इस त्रुटि का उद्देश्य क्या है। जाहिर है, यदि संकलक वास्तविक मूल्य से निपट सकता है, तो यह पूरी तरह से योग्य नाम से निपटने में सक्षम होना चाहिए जैसा कि यह स्थिरांक के लिए होगा। असल में, मैंने माना होगा कि संकलक स्थिरता को पूर्णतः योग्य नाम में बदल देता है।

तो, जावा गुरु, इसके पीछे तर्क क्या है? धन्यवाद!

+1

व्यक्तिगत रूप से, मुझे कोई फर्क नहीं पड़ता कि स्विच-केस ब्लॉक में एनम योग्य नहीं हो सकते हैं; यह कोड को और अधिक पठनीय बनाता है। ध्यान रखें कि आपके पास मौजूद एनम कक्षाओं के लिए (कोड में आप संपादित कर सकते हैं), सबसे अच्छा अभ्यास स्विच-केस ब्लॉक का उपयोग कभी नहीं करना है। इस स्थिति में स्विच-केस से एनम निरंतर-विशिष्ट विधियां अधिक रखरखाव और कम नाजुक हैं। – scottb

उत्तर

18

JLS से:

(One reason for requiring inlining of constants is that switch statements require constants on each case, and no two such constant values may be the same. The compiler checks for duplicate constant values in a switch statement at compile time; the class file format does not do symbolic linkage of case values.)

आप इसे here पा सकते हैं।

+1

आपने कभी यह बिट कैसे पाया? एक घास के मैदान में एक सुई खोजने के लिए +1। –

+0

lol मुझे इस बारे में कुछ पढ़ना याद आया ... सौभाग्य से मेरे पास इस तरह के अवसरों के लिए मेरे डेस्कटॉप पर जेएलएस पीडीएफ है;) – laginimaineb

+0

मैंने इसे पसंद किया है (इसलिए मुझे बस एक नया टैब खोलना है और जेएलएस टाइप करना है) , लेकिन मुझे अभी भी कुछ भी प्रासंगिक नहीं मिला। मुझे लगता है कि मैंने संभावित कारण के रूप में बाइनरी संगतता के बारे में नहीं सोचा था। –

3

यह एक अजीब बात है। मुझे इसके बारे में जानने के लिए कुछ खोदना पड़ा। ऐसा लगता है कि पूर्ण योग्य नाम के मुकाबले ऑब्जेक्ट पर स्विच को टाइप करना सुरक्षित है।

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6191812 एक बग रिपोर्ट थी जो आपको योग्य enums निर्दिष्ट करने की अनुमति देने के लिए उठाई गई थी, लेकिन इसे बंद कर दिया गया था और आप संलग्नक में देखे जाने वाले कारणों के लिए कार्रवाई नहीं कर पाए थे।