2012-06-14 8 views
6

संभव डुप्लिकेट:
Java: Local Enumsजावा क्यों एक विधि के भीतर enum परिभाषित करने की अनुमति नहीं है?

क्यों हम जावा में एक विशिष्ट विधि के भीतर enum को परिभाषित नहीं कर सकते हैं? यदि मेरे पास एक परिदृश्य है जहां मैं उन enum मानों का उपयोग किसी विधि में केवल किसी अन्य स्थान पर नहीं करूँगा। क्या यह विधि में घोषित करना अच्छा नहीं होगा बल्कि इसे वैश्विक रूप से परिभाषित करना अच्छा होगा? मेरा मतलब सार्वजनिक या डिफ़ॉल्ट है।

+0

जॉन स्कीट ने कहा कि [enums स्पष्ट रूप से स्थैतिक हैं] (http://stackoverflow.com/a/4827347/348975)। – emory

उत्तर

7

आप JavaDocs द्वारा बताए गए विधि स्तर पर परिभाषित नहीं कर सकते हैं। (मैं उस भाषा को देखना चाहता हूं जिसने इसे अनुमति दी)

नेस्टेड एनम प्रकार निश्चित रूप से स्थैतिक हैं। स्पष्ट रूप से घोंसला वाले एनम प्रकार को स्थिर होने की घोषणा करने की अनुमति है।

इसका तात्पर्य है कि स्थानीय (§14.3) एनम को परिभाषित करना असंभव है, या एक आंतरिक वर्ग (§8.1.3) में एक enum परिभाषित करना असंभव है।

क्या आप इसे कक्षा के स्तर पर और विधि के स्तर पर एक चर में यह घोषणा कर सकते हैं:

public class Light { 
    ... 
    private LightSwitch position; 
    private enum LightSwitch { 
     On, 
     Off 
    } 
    public void SwitchOn() { 
     Switch(LightSwitch.On); 
    } 
    public void SwitchOff() { 
     Switch(LightSwitch.Off); 
    } 
    private void Switch(LightSwitch pos) { 
     position = pos; 
    } 
} 
+0

सवाल यह था कि, तथ्य यह है कि आप एक नहीं दे सकते हैं। "मैं एक ऐसी भाषा देखना चाहूंगा जिसने अनुमति दी" - सी और सी ++। –

3

JLS से

नेस्टेड enum प्रकार परोक्ष स्थिर रहे हैं। यह के लिए अनुमत है स्पष्ट रूप से एक घोंसला वाले enum प्रकार स्थिर होने के लिए घोषित करें।

इसका तात्पर्य है कि एक आंतरिक वर्ग (§8.1.3) में एक enum परिभाषित करने के लिए स्थानीय (§14.3) enum, या को परिभाषित करना असंभव है।

इसके अलावा, वे आम तौर पर अंतिम रूप से अंतिम हैं। वर्ग के हिस्से के रूप में enums होने के लिए यह सामान्य पैटर्न है क्योंकि आमतौर पर वे निरंतर व्यवहार करते हैं।

एक enum प्रकार निश्चित रूप से अंतिम होता है जब तक कि इसमें कम से कम एक enum स्थिर होता है जिसमें कक्षा का शरीर होता है।

0

आप तरीकों के भीतर enums परिभाषित कर सकते हैं नहीं है, लेकिन आप वर्गों को परिभाषित कर सकते हैं, इसलिए यदि आप वास्तव में इस तरह से अपने विधि डिजाइन करना चाहते हैं, आप अपने स्थानीय वर्ग वस्तु की एक सरणी परिभाषित कर सकते हैं।

public void doSomething() { 
    class Country { 
     int population = 0; 
     String name = null; 

     public Country(int population, String name) { 
      this.population = population; 
      this.name = name; 
     } 

    } 
    Country[] countries = { new Country(85029304, "Germany"), new Country(61492053, "Spain") }; 
    // do stuff with countries 
}