Ist es möglich, einer Aufzählung in Java einen numerischen Wert zuzuweisen?

132

Ist so etwas in Java möglich? Kann man Enum-Elementen in Java benutzerdefinierte numerische Werte zuweisen?

public enum EXIT_CODE {
    A=104, B=203;
}
James Raitsev
quelle
Nicht direkt , wie Sie geschrieben haben, das heißt, in dem ein ENUM - Wert entspricht eine Zahl, aber ja indirekt wie in Ben S des Link angezeigt.
Luftkissenfahrzeug voller Aale
Mögliches Duplikat von kann Enum Startwert in Java setzen
Ben S
@ Benoit Ich glaube nicht, dass es ein Betrug ist: Bei diesem geht es darum, nur den ersten Wert festzulegen und von dort aus zu erhöhen. Hier geht es darum, alle Werte festzulegen. Aber definitiv verwandt.
Ciro Santilli 1 冠状 病 六四 事件 法轮功

Antworten:

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

    private int numVal;

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

    public int getNumVal() {
        return numVal;
    }
}
Bhesh Gurung
quelle
11
Sie können den Enum-Konstruktor nicht im Code verwenden. EXIT_CODE.Aund EXIT_CODE.Bsind die einzigen Instanzen, die jemals existieren werden.
Bhesh Gurung
2
@IgorGanapolsky Insbesondere kann der Konstruktor einer Aufzählung nicht öffentlich sein: stackoverflow.com/questions/3664077/…
Ciro Santilli 2 冠状 病 六四 事件 2
funktioniert das noch mit gson und konvertiert von json.
Zapnologica
4
Sie können die Variable auch "public final int numVal" deklarieren und direkt als EXIT_CODE.A.numVal (ich bevorzuge den Namen 'value') darauf zugreifen, ohne dass eine Zugriffsmethode erforderlich ist. Da es endgültig ist, kann es nur im Konstruktor festgelegt werden. IMO führt es zu etwas saubererem Code, aber es ist meistens eine Frage der Präferenz, nehme ich an. Durch die Verwendung einer endgültigen Variablen sparen Sie eine Methodendefinition.
Steve Ferguson
34

Ja , und noch einige Beispiele aus der Dokumentation:

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));
    }
}
Ben S.
quelle
Warum befindet sich Ihre öffentliche statische Leere main (String [] args) innerhalb der Aufzählung selbst?
IgorGanapolsky
3
@IgorGanapolsky Um das Beispiel in sich geschlossen zu machen, denke ich!
mat_boy
2
@IgorGanapolsky: weil es so in den offiziellen Dokumenten ist (folgen Sie dem Ja- Link)
serv-inc
@ user1587329 Interessant, ich denke, das ist nur zu Testzwecken. Ich sehe keine Möglichkeit, dies im Produktions-Release-Code zu verwenden ...
IgorGanapolsky
12

Angenommen, EXIT_CODE bezieht sich auf System . exit (exit_code), dann könnten Sie dies tun

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 ) ;
      }
}

Dann können Sie Folgendes an geeigneten Stellen in Ihren Code einfügen

ExitCode . NORMAL_SHUTDOWN . exit ( ) '

Emory
quelle
3

Wenn Sie die Antwort von Bhesh Gurung auf die Zuweisung von Werten erweitern, können Sie eine explizite Methode zum Festlegen des Werts hinzufügen

   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
      }
   }

Vom Aufruf der Anwendung

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

// Sie haben ab sofort eine gültige Aufzählung

[Kann seine Antwort nicht kommentieren und daher separat veröffentlichen]

Sudhakar
quelle
2

Wenn Sie nach einer Möglichkeit suchen, Konstanten in einer Klasse zu gruppieren, können Sie eine statische innere Klasse verwenden:

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;
    }   
}
Rigo Brinkman
quelle