क्या मैं जावा में enum start value सेट कर सकता हूँ?


194

मैं कुछ स्थिरांक बनाने के लिए एनम का उपयोग करता हूं:

enum ids {OPEN, CLOSE};

ओपेन मूल्य शून्य है, लेकिन मैं इसे 100 के रूप में चाहता हूं। क्या यह संभव है?


@ScottF क्या आप चाहते हैं कि एनम कैसे उपयोग करें?
अनीश बी

शीर्ष उत्तर में, एक एनुम परिभाषा है। मैं इस बात का उदाहरण चाहूंगा कि कोड में उस परिभाषित एनम का उपयोग कैसे किया जाएगा। उदाहरण के लिए, एक विशिष्ट पूर्णांक मान के साथ एक Enum उदाहरण बनाने के लिए परिभाषित ctor का उपयोग कैसे किया जाएगा।
स्कॉटएफ

@ScottF अगर मैं तुम होती, तो इस पोस्ट पर एक इनाम देने के बजाय मैं एक पूरी तरह से नया सवाल पोस्ट करूँगी ..... या, एनम के बारे में डॉक्यूमेंटेशन पढ़ो। ऐसा लगता है कि आपको इसके बारे में कुछ मुख्य ज्ञान को समझने की आवश्यकता है;)
lealceldeiro

enum ids {OPEN = 100, CLOSE};?
श्री ऑस्कर

जवाबों:


307

जावा एनम सी या सी ++ एनम की तरह नहीं हैं, जो वास्तव में पूर्णांक के लिए लेबल हैं।

जावा एनम को कक्षाओं की तरह अधिक कार्यान्वित किया जाता है - और उनमें कई गुण भी हो सकते हैं।

public enum Ids {
    OPEN(100), CLOSE(200);

    private final int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
}

बड़ा अंतर यह है कि वे टाइप-सेफ हैं, जिसका मतलब है कि आपको SIZE वैरिएबल के लिए कलर एनम असाइन करने की चिंता नहीं करनी चाहिए।

अधिक के लिए http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html देखें ।


आपके कथन के आधार पर, अनुक्रमिक पूर्णांकों (एक सी ++ एनुम के समान), किसी इंडेक्स के लिए किसी ऐरे या किसी चीज़ में लिखने के लिए जावा का उपयोग करने का सबसे अच्छा अभ्यास होगा, लिखना होगा: एनम आईड्स {एनएएमई (0), एजीई (1) ), ऊंचाई (2), वजन (3); } धन्यवाद, -बीएन
बीएन।

संभवतः, और खासकर यदि आप कभी कहीं अभिन्न मूल्यों को क्रमबद्ध करते हैं।
लैविनियो

1
क्या आप कृपया बता सकते हैं कि किसी फ़ंक्शन में इस एनम का उपयोग कैसे करें?
बग्स हैपन

2
यह जावा मानकों का आलसी है कि एक मान के लिए सेट करने की अनुमति नहीं है। कम से कम c # यह अनुमति देता है और प्रकार-सुरक्षित है।
15

2
FWIW, C ++ 11 में अब एक प्रकार-सुरक्षित है enum class
फीनिक्स

92

हाँ। आप गणनाकर्ता को संख्यात्मक मान पास कर सकते हैं, जैसे:

enum Ids {
  OPEN(100),
  CLOSE(200);

  private int value;    

  private Ids(int value) {
    this.value = value;
  }

  public int getValue() {
    return value;
  }
}

देखें सन जावा भाषा गाइड अधिक जानकारी के लिए।


ठंडा। क्या मिश्रण करना संभव है? यानी चुने हुए Enum मानों के लिए केवल संख्याएँ असाइन करें।
फ्रेडरिक नॉर्ड

प्राइवेट मॉडिफायर
एनम

@ फ़्रेडरिकनॉर्ड - ज़रूर। बस एक दूसरे निजी कंस्ट्रक्टर को बिना किसी आर्गन्स के साथ जोड़ें जो valueएक (कहते हैं) शून्य को आरंभीकृत करता है। फिर DANCEमूल्यों की सूची में शामिल करें (कहें) ।
स्टीफन सी

15

इस तरह का उपयोग करने के बारे में whats:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public int getColorValue() {
              switch (this) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }
}

एक ही विधि है ।।

आप स्टैटिक विधि का उपयोग कर सकते हैं और Enum को पैरामीटर की तरह पास कर सकते हैं:

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public static int getColorValue(HL_COLORS hl) {
              switch (hl) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }

ध्यान दें कि ये दो तरीके कम मेमोरी और अधिक प्रोसेस यूनिट का उपयोग करते हैं .. मैं नहीं कहता कि यह सबसे अच्छा तरीका है लेकिन इसका सिर्फ एक और तरीका है।


1
getColorValue()दूसरे उदाहरण में सिंक्रनाइज़ क्यों किया गया है ?
जोसफतव

@josaphatv दूसरे उदाहरण में सभी कार्यक्षमता स्थिर है, यह कभी नहीं बदलता है। आप HL_COLORS.getColorValue(HL_COLORS.YELLOW);enum को इनिशियलाइज़ किए बिना करना चाह सकते हैं ।
माज़ुन्की

11

यदि आप बहुत बड़े ईनम प्रकारों का उपयोग करते हैं, तो निम्नलिखित उपयोगी हो सकते हैं;

public enum deneme {

    UPDATE, UPDATE_FAILED;

    private static Map<Integer, deneme> ss = new TreeMap<Integer,deneme>();
    private static final int START_VALUE = 100;
    private int value;

    static {
        for(int i=0;i<values().length;i++)
        {
            values()[i].value = START_VALUE + i;
            ss.put(values()[i].value, values()[i]);
        }
    }

    public static deneme fromInt(int i) {
        return ss.get(i);
    }

    public int value() {
    return value;
    }
}

7

यदि आप सी / सी ++ (बेस नंबर और नेक्स्ट इन्क्रीमेंटल) की गणना करना चाहते हैं:)

enum ids {
    OPEN, CLOSE;
    //
    private static final int BASE_ORDINAL = 100;
    public int getCode() {
        return ordinal() + BASE_ORDINAL;
    }
};

public class TestEnum {
    public static void main (String... args){
        for (ids i : new ids[] { ids.OPEN, ids.CLOSE }) {
            System.out.println(i.toString() + " " + 
                i.ordinal() + " " + 
                i.getCode());
        }
    }
}
OPEN 0 100
CLOSE 1 101

4

ऑर्डिनल () फ़ंक्शन एनम में पहचानकर्ता की सापेक्ष स्थिति लौटाता है। सी-स्टाइल एनम के साथ, ऑफसेट के साथ स्वचालित अनुक्रमण प्राप्त करने के लिए आप इसका उपयोग कर सकते हैं।

उदाहरण:

public class TestEnum {
    enum ids {
        OPEN,
        CLOSE,
        OTHER;

        public final int value = 100 + ordinal();
    };

    public static void main(String arg[]) {
        System.out.println("OPEN:  " + ids.OPEN.value);
        System.out.println("CLOSE: " + ids.CLOSE.value);
        System.out.println("OTHER: " + ids.OTHER.value);
    }
};

आउटपुट देता है:

OPEN:  100
CLOSE: 101
OTHER: 102

संपादित करें: बस एहसास हुआ कि यह ग्रैगैंड्स के उत्तर के समान है , लेकिन मैं इसे यहां छोड़ दूंगा क्योंकि यह बहुत साफ है और लगभग उतना ही है जितना आप सी स्टाइल एनम को प्राप्त कर सकते हैं।


उदाहरण में आप एक एनम लेते हैं और एक इंट प्राप्त करते हैं। क्या आप रिवर्स दिखा सकते हैं, एक इंट ले सकते हैं और एक
एनम के

प्रश्न के अनुसार, मेरा मानना ​​है कि यह सबसे उपयुक्त उत्तर है। यहां हमने नए वेरिएबल को परिभाषित किए बिना और उन्हें कंस्ट्रक्टर के माध्यम से निर्दिष्ट करने के लिए 100 से शुरू करने के लिए एनम के डिफ़ॉल्ट इंडेक्स को बदल दिया है।
राहुल जैन

@RahulJain मैं इसके बजाय स्वीकृत उत्तर का उपयोग करूंगा। यह मुझे साफ लगता है।
lealceldeiro

1

@scottf

एनुम एक सिंगलटन की तरह है। JVM उदाहरण बनाता है।

यदि आप इसे कक्षाओं के साथ अपने आप बना लेंगे तो ऐसा लग सकता है

public static class MyEnum {

    final public static MyEnum ONE;
    final public static MyEnum TWO;

    static {
        ONE = new MyEnum("1");
        TWO = new MyEnum("2");
    }

    final String enumValue;

    private MyEnum(String value){
        enumValue = value;    
    }

    @Override
    public String toString(){
        return enumValue;
    }


}

और इस तरह इस्तेमाल किया जा सकता है:

public class HelloWorld{

   public static class MyEnum {

       final public static MyEnum ONE;
       final public static MyEnum TWO;

       static {
          ONE = new MyEnum("1");
          TWO = new MyEnum("2");
       }

       final String enumValue;

       private MyEnum(String value){
           enumValue = value;    
       }

       @Override
       public String toString(){
           return enumValue;
       }


   }

    public static void main(String []args){

       System.out.println(MyEnum.ONE);
       System.out.println(MyEnum.TWO);

       System.out.println(MyEnum.ONE == MyEnum.ONE);

       System.out.println("Hello World");
    }
}

0
 public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     System.out.println(id1.getValue());
    }
}

enum Ids {
    OPEN(100), CLOSE(200);

    private final int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
}

@scottf, शायद आप ENUM में परिभाषित कंस्ट्रक्टर के कारण भ्रमित हैं।

मुझे वह समझाने दो।

जब class loaderभार enumवर्ग, तब enumनिर्माणकर्ता भी कहा जाता है। किस पर!! हाँ, यह कहा जाता है OPENऔर close। क्या मूल्यों के साथ 100के लिए OPENऔर 200के लिएclose

क्या मेरा अलग मूल्य हो सकता है?

हाँ,

public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     id1.setValue(2);
     System.out.println(id1.getValue());
    }
}

enum Ids {
    OPEN(100), CLOSE(200);

    private int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
    public void setValue(int value) { id = value; }
}

लेकिन, यह बुरा अभ्यास है। जैसे कि , पूर्वनिर्धारित स्थिरांक के ऐसे छोटे समूह का enumप्रतिनिधित्व करने के लिए उपयोग किया जाता है।constantsdays of weekcolors in rainbow


0

मुझे लगता है कि आप सी ++ एन्यूमरेटर को देखने से भ्रमित हैं। जावा प्रगणक अलग हैं।

यदि आप C / C ++ के लिए उपयोग किए जाते हैं तो यह कोड होगा:

public class TestEnum {
enum ids {
    OPEN,
    CLOSE,
    OTHER;

    public final int value = 100 + ordinal();
};

public static void main(String arg[]) {
    System.out.println("OPEN:  " + ids.OPEN.value);
    System.out.println("CLOSE: " + ids.CLOSE.value);
    System.out.println("OTHER: " + ids.OTHER.value);
}
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.