2015-06-06 13 views
22

के सभी enum स्थिरांक शामिल है मुझे अभी एहसास हुआ कि जावा में एक enum स्थिरता एक ही प्रकार के सभी गणना स्थिरांक शामिल है। है यह जवाबी सहज ज्ञान युक्त या यहाँ तक कि विसंगत किएक enum निरंतर एक ही enum वर्ग

enable 
disable 
deleted 

नहीं:

उदाहरण के लिए, निम्नलिखित कोड वैध है:

enum State { 
    enable, disable, deleted; 
} 

class Test { 
    public static void main(String[] args) { 
     for (State s : State.enable.disable.values()) { 
      System.out.println(s); 
     } 
    } 
} 

मैं जब मैंने देखा कि उत्पादन बहुत हैरान था enable निरंतर disable स्थिर है जो बदले में सभी State enum स्थिरांक रखता है?

इस भाषा डिज़ाइन के पीछे संभावित विचार क्या है?

+0

संबंधित http://stackoverflow.com/questions/61 0458/क्यों-isnt-calling-a-static-method-by-way-of-example-an-error-for-the-java-co – Naitree

+10

** बस अपनी चेतावनियां इस पर स्विच करें: ** "स्थिर फ़ील्ड State.disable एक स्थिर तरीके से पहुंचा जाना चाहिए। " – maaartinus

उत्तर

35

डिजाइनरों ने पहली बार जावा को डिज़ाइन किया जब गलतियों ने गलती की: स्थिर वर्ग, जो कक्षा से संबंधित हैं, और कक्षा के किसी भी उदाहरण के लिए, कक्षा के उदाहरण का उपयोग करके सुलभ हो सकते हैं। इस वर्ग पर विचार करें:

class Foo { 
    public static int bar = 0; 
} 

आप सामान्य रूप से बार चर

int i = Foo.bar; 

का उपयोग कर का उपयोग करना चाहिए लेकिन आप कर सकते हैं भी

Foo foo = new Foo(); 
int i = foo.bar; 

है यही कारण है कि यहां क्या हो रहा है है। enable, disable, values(), State वर्ग के स्थिर सदस्य हैं जिन्हें State.enable, State.disable और State.values() का उपयोग करके एक्सेस किया जाना चाहिए।लेकिन enable और disable भी वर्ग State की हैं उदाहरणों, और इस प्रकार भी वर्ग के स्थिर सदस्यों तक पहुँचने के लिए इस्तेमाल किया जा सकता:

State state = State.enable; 
State state2 = state.disable; 

या सरल:

State state2 = State.enable.disable; 

भद्दा, आप भी कर सकते थे ऐसा करें कि NullPointerException प्राप्त किए बिना:

State state = null; 
State[] allStates = state.values(); 
+0

यह कोई गलती नहीं है, कंपाइलर संकलन समय के दौरान कक्षा के नाम के साथ आवृत्ति चर को प्रतिस्थापित करता है। – Yurets

+0

@Yurets जेबी यह सुझाव नहीं दे रहा है कि संकलक ने गलती की, लेकिन जावा के डिजाइनरों ने गलती की। – immibis

4

.values()enum पर एक अंतर्निहित static विधि और कोई फर्क नहीं पड़ता जो मूल्य आप इसे लागू कर रहे हैं पर, आप State.values() के रूप में एक ही परिणाम मिलेगा।

यह बहुत अधिक है कि आप एक उदाहरण पर एक स्थिर विधि का आह्वान कर रहे थे (इसके बजाय कक्षा के नाम का सीधे संदर्भ देकर)।

असल में, उदाहरणों पर static विधियों का आह्वान करना, चेतावनी देना चाहिए, संकेत देता है कि आप अनुचित तरीके से कर रहे हैं।

13

values()स्थिर विधि है। जावा भाषा आपको उस वर्ग के किसी भी उदाहरण पर कक्षा की स्थैतिक विधि कॉल करने की अनुमति देती है, लेकिन उदाहरण को अनदेखा किया जाता है।

enable, disable और deleted के लिए समान, जो स्थैतिक फ़ील्ड हैं।

State.enable में disable नहीं है; बल्कि, State.enable.disable को State.disable के समान माना जाता है। और State.enable.disable.values() को State.disable.values() के समान माना जाता है, जिसे State.values() के समान माना जाता है, जो निश्चित रूप से सभी तीन मानों की एक सरणी देता है।