Est-il possible d'attribuer une valeur numérique à une énumération en Java?

132

Est-ce que quelque chose comme ça est possible en Java? Peut-on attribuer des valeurs numériques personnalisées aux éléments d'énumération en Java?

public enum EXIT_CODE {
    A=104, B=203;
}
James Raitsev
la source
Pas directement comme vous l'avez écrit, c'est-à-dire où une valeur d'énumération est égale à un nombre, mais oui indirectement comme indiqué dans le lien de Ben S.
Aéroglisseur plein d'anguilles
duplication possible de can set enum start value in java
Ben S
@Benoit Je ne pense pas que ce soit une dupe: celle-ci consiste à définir uniquement la première valeur et à incrémenter à partir de là, il s'agit de définir toutes les valeurs. Mais certainement lié.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

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
la source
11
Vous ne pouvez pas utiliser le constructeur enum dans le code. EXIT_CODE.Aet EXIT_CODE.Bsont les seules instances qui existeront jamais.
Bhesh Gurung
2
@IgorGanapolsky en particulier, le constructeur d'une énumération ne peut pas être public: stackoverflow.com/questions/3664077/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
cela fonctionnera-t-il toujours avec gson et la conversion de json.
Zapnologica
4
Vous pouvez également déclarer la variable "public final int numVal" et y accéder directement en tant que EXIT_CODE.A.numVal (je préfère le nom 'value'), sans avoir besoin d'une méthode d'accesseur. Comme il est définitif, il ne peut être défini que dans le constructeur. IMO, cela conduit à un code légèrement plus propre, mais c'est surtout une question de préférence, je suppose. L'utilisation d'une dernière variable vous permet d'économiser une définition de méthode.
Steve Ferguson
34

Oui , puis quelques exemples tirés de la documentation:

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
la source
Pourquoi votre void principal public statique (String [] args) est-il à l'intérieur de l'énumération elle-même?
IgorGanapolsky
3
@IgorGanapolsky Pour rendre l'exemple autonome, je suppose!
mat_boy
2
@IgorGanapolsky: parce qu'il en est ainsi dans la documentation officielle (suivez le lien Oui )
serv-inc
@ user1587329 Intéressant, je suppose que c'est uniquement à des fins de test. Je ne vois pas de moyen d'utiliser cela dans le code de version de production ...
IgorGanapolsky
12

En supposant que EXIT_CODE fait référence à System . exit(exit_code), vous pouvez faire

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

Ensuite, vous pouvez mettre ce qui suit aux endroits appropriés dans votre code

ExitCode . NORMAL_SHUTDOWN . exit ( ) '

émory
la source
3

En étendant la réponse de Bhesh Gurung pour l'attribution de valeurs, vous pouvez ajouter une méthode explicite pour définir la valeur

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

Depuis l'appel de l'application

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

// Vous avez une énumération valide à partir de maintenant

[Impossible de commenter sa réponse, donc de la publier séparément]

Sudhakar
la source
2

Si vous recherchez un moyen de regrouper des constantes dans une classe, vous pouvez utiliser une classe interne statique:

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
la source