2013-07-15 8 views
14

क्या एनम के लिए ++ ऑपरेटर को कार्यान्वित करना संभव है?क्या जावा एनम के लिए कोई वृद्धि ऑपरेटर ++ है?

मैं एक enum के साथ state machine की वर्तमान स्थिति को संभालता हूं और ++ ऑपरेटर का उपयोग करने में सक्षम होना अच्छा होगा।

+0

यदि आप ऑपरेटर ओवरलोडिंग के बारे में बात कर रहे हैं, नहीं, यह जावा – BackSlash

+5

के साथ नहीं किया जा सकता है कृपया [यह उत्तर] देखें (http://stackoverflow.com/a/17006263/18157)। ध्यान दें कि ++ में enums के लिए प्रत्यक्ष समकक्ष नहीं हो सकता है क्योंकि एक enum निरंतर अपरिवर्तनीय है। सबसे अच्छा आप कर सकते हैं 'अगली()' विधि को परिभाषित करता है जो अगले एनम मान देता है। –

+3

यह एक भ्रामक तुलना है: पूर्णांक स्थिरांक भी अपरिवर्तनीय हैं (उस '++ में '5' का अर्थ नहीं बदलता है), लेकिन' ++ 'ठीक काम करता है क्योंकि यह बदलता है * जो * आपके स्थानीय को पूर्णांक" संदर्भित करता है " । 'स्प्रिंग' के बजाय 'SUMMER' पर इंगित करने के लिए स्थानीय 'सीजन' को बदलकर, enums पर '++' एक ही चीज़ कर सकता है। – amalloy

उत्तर

37

आप "को बढ़ा" कर सकते हैं एक enum, लेकिन आप अगले enum प्राप्त कर सकते हैं:

// MyEnum e; 
MyEnum next = MyEnum.values()[e.ordinal() + 1]; 

लेकिन बेहतर अपने enum पर एक उदाहरण विधि बनाने के लिए किया जाएगा।

नोट में अच्छी तरह से कैसे समस्याग्रस्त अगले मूल्य पिछले enum उदाहरण के लिए नियंत्रित किया जाता है, जिसके लिए कोई "अगला" उदाहरण है:

public enum MyEnum { 

    Alpha, 
    Bravo, 
    Charlie { 
     @Override 
     public MyEnum next() { 
      return null; // see below for options for this line 
     }; 
    }; 

    public MyEnum next() { 
     // No bounds checking required here, because the last instance overrides 
     return values()[ordinal() + 1]; 
    } 
} 

तो तुम ऐसा कर सकता है:

// MyEnum e; 
e = e.next(); 

next() विधि के कार्यान्वयन के लिए आपके पास उचित विकल्प शामिल हैं:

  • return null; // there is no "next"
  • return this; // capped at the last instance
  • return values()[0]; // rollover to the first

विधि ओवरराइड इसकी लंबाई की जाँच करने के values() सरणी पैदा करने की संभावित लागत से बचा जाता है। उदाहरण के लिए, next() के लिए क्रियान्वयन की जहां पिछले उदाहरण नहीं ओवरराइड यह हो सकता है करता है:

public MyEnum next() { 
    if (ordinal() == values().length - 1) 
     throw new NoSuchElementException(); 
    return values()[ordinal() + 1]; 
} 

यहाँ, दोनों ordinal() और values() कर रहे हैं (आमतौर पर) दो बार कहा जाता है, जो की तुलना में निष्पादित करने के लिए अधिक खर्च होंगे उपरोक्त ओवरराइड संस्करण।

+0

आपको 'अगली' विधि में वास्तव में उस 'MyEnum' पैरामीटर की आवश्यकता नहीं है, क्या आप? –

+0

@MichaelLang damn - मैंने एक स्थिर विधि के साथ शुरुआत की, फिर इसे एक आवृत्ति विधि में बदल दिया, लेकिन पैरामीटर को छोड़ दिया :(Thx। – Bohemian

+0

जिम गैरीसन का जवाब (ऊपर उसका लिंक देखें) कॉल मूल्य() केवल एक बार - प्रत्येक कॉल प्रतियां सरणी। इसके अलावा, यह मॉड्यूलस ऑपरेटर के साथ, गणना के अंत से पहले वृद्धि को संभालती है। –

4

नहीं। जावा किसी भी उपयोगकर्ता द्वारा परिभाषित प्रकार के लिए अनुकूलित ऑपरेटर ओवरलोडिंग का समर्थन नहीं करता है, जिसमें enums शामिल हैं।

हालांकि, आप enum क्लास में एक विधि परिभाषित कर सकते हैं जो अगली गणनाकर्ता लौटा दी।

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