是否可以在Java中为枚举分配数值?


132

在Java中有可能发生这种情况吗?可以为Java中的枚举元素分配自定义数值吗?

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

不是直接写出来的,即枚举值等于数字,而是间接的,如Ben S的链接所示。
气垫船充满鳗鱼,2012年


@Benoit我不认为这是骗人的:那是关于只设置第一个值并从那里递增,这是关于设置所有值。但绝对有关。
西罗Santilli郝海东冠状病六四事件法轮功2015年

Answers:


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是唯一存在的实例。
Bhesh Gurung 2014年

2
@IgorGanapolsky特别是,枚举的构造函数不能是市民:stackoverflow.com/questions/3664077/...
西罗桑蒂利郝海东冠状病六四事件法轮功

仍然可以与gson一起使用并从json转换吗?
Zapnologica

4
您还可以声明变量“ public final 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));
    }
}

为什么您的公共静态void main(String [] args)在枚举本身内部?
IgorGanapolsky 2014年

3
@IgorGanapolsky我想使这个例子自成一体!
mat_boy 2014年

2
@IgorGanapolsky:因为在官方文档中就是这种方式(遵循Yes -link)
serv-inc

@ user1587329有趣的是,我猜这仅是出于测试目的。我看不到在生产发布代码中使用该方法的方法...
IgorGanapolsky

12

假设EXIT_CODE引用了System . exit(exit_code),则可以执行

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

扩展Bhesh Gurung对于分配值的答案,您可以添加显式方法来设置值

   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;
    }   
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.