क्या जावा में एनम के लिए संख्यात्मक मान निर्दिष्ट करना संभव है?


132

क्या जावा में ऐसा कुछ संभव है? क्या जावा में तत्वों को एन्यूमर करने के लिए कोई कस्टम न्यूमेरिक मान दे सकता है?

public enum EXIT_CODE {
    A=104, B=203;
}

सीधे नहीं जैसा कि आपने लिखा है, यानी, जहां एक एनम वैल्यू एक संख्या के बराबर है, लेकिन हाँ परोक्ष रूप से जैसा कि बेन एस के लिंक में दिखाया गया है।
भरा होवरक्राफ्ट

संभव है कि डुप्लिकेट का मान java में शुरू हो सकता है
बेन एस

@ बेनोइट मुझे नहीं लगता कि यह एक धोखा है: कि कोई भी पहला मूल्य निर्धारित करने और वहां से वेतन वृद्धि के बारे में है, यह सभी मूल्यों को स्थापित करने के बारे में है। लेकिन निश्चित रूप से संबंधित।
सिरो सेंटिल्ली। Iro iro i

जवाबों:


216
public enum EXIT_CODE {
    A(104), B(203);

    private int numVal;

    EXIT_CODE(int numVal) {
        this.numVal = numVal;
    }

    public int getNumVal() {
        return numVal;
    }
}

11
आप कोड में एनम कंस्ट्रक्टर का उपयोग नहीं कर सकते। EXIT_CODE.Aऔर EXIT_CODE.Bकेवल उदाहरण हैं जो कभी भी मौजूद होंगे।
भेश गुरुंग

2
@IgorGanapolsky विशेष रूप से, एक एनम का निर्माता सार्वजनिक नहीं हो सकता है: stackoverflow.com/questions/3664077/…
Ciro Santilli 郝海东 ap ap 事件 法轮功

क्या यह अभी भी gson के साथ काम करेगा और json से परिवर्तित होगा।
Zapnologica

4
आप एक चर विधि की आवश्यकता के बिना, चर को "सार्वजनिक अंतिम int numVal" घोषित कर सकते हैं और इसे सीधे EXIT_CODE.A.numVal (मैं नाम 'मान' पसंद करता हूं) के रूप में सीधे एक्सेस कर सकता हूं। चूंकि यह अंतिम है, इसे केवल कंस्ट्रक्टर में सेट किया जा सकता है। IMO यह थोड़ा क्लीनर कोड की ओर जाता है, लेकिन यह ज्यादातर वरीयता का मामला है, मुझे लगता है। अंतिम चर का उपयोग करने से आपको एक विधि परिभाषा मिलती है।
स्टीव फर्ग्यूसन

34

हाँ , और फिर कुछ, प्रलेखन से उदाहरण:

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);

    // in kilograms
    private final double mass;
    // in meters
    private final double radius;
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    private double mass() { return mass; }
    private double radius() { return radius; }

    // universal gravitational 
    // constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage: java Planet <earth_weight>");
            System.exit(-1);
        }
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }
}

अपने सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] args) में एनम ही क्यों है ??
इगोरगानापोलस्की

3
@IgorGanapolsky उदाहरण को आत्म-निहित बनाने के लिए मुझे लगता है!
mat_boy

2
@IgorGanapolsky: क्योंकि यह आधिकारिक डॉक्स में इस तरह है ( हाँ
-

@ user1587329 दिलचस्प है, मुझे लगता है कि केवल परीक्षण प्रयोजनों के लिए है। मैं उत्पादन रिलीज कोड में उपयोग करने का एक तरीका नहीं देखता ...
इगोरगानपोलस्की

12

मान लें कि EXIT_CODE का उल्लेख है System . exit(बाहर निकलें_कोड) तो आप कर सकते हैं

enum ExitCode
{
      NORMAL_SHUTDOWN ( 0 ) , EMERGENCY_SHUTDOWN ( 10 ) , OUT_OF_MEMORY ( 20 ) , WHATEVER ( 30 ) ;

      private int value ;

      ExitCode ( int value )
      {
           this . value = value ;
      }

      public void exit ( )
      {
            System . exit ( value ) ;
      }
}

फिर आप निम्नलिखित को अपने कोड में उपयुक्त स्थानों पर रख सकते हैं

ExitCode . NORMAL_SHUTDOWN . exit ( ) '


3

मूल्यों को निर्दिष्ट करने के लिए भेश गुरुंग के उत्तर का विस्तार करते हुए, आप मूल्य निर्धारित करने के लिए स्पष्ट विधि जोड़ सकते हैं

   public ExitCode setValue( int value){
      //  A(104), B(203);
      switch(value){
        case 104: return ExitCode.A;
        case 203: return ExitCode.B;
        default:
                   return ExitCode.Unknown //Keep an default or error enum handy
      }
   }

कॉलिंग एप्लिकेशन से

int i = 104; 
ExitCode serverExitCode = ExitCode.setValue(i);

// आपने अभी से मान्य एनम है

[उनके जवाब पर टिप्पणी करने में असमर्थ, इसलिए इसे अलग से पोस्ट करना]


2

यदि आप एक कक्षा में समूह स्थिरांक का रास्ता खोज रहे हैं, तो आप एक स्थिर आंतरिक वर्ग का उपयोग कर सकते हैं:

public class OuterClass {
    public void exit(boolean isTrue){
        if(isTrue){
            System.exit(ExitCode.A);
        }else{
            System.exit(ExitCode.B);
        }
    }
    public static class ExitCode{
        public static final int A = 203;
        public static final int B = 204;
    }   
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.