Java에서 숫자 값을 열거 형에 할당 할 수 있습니까?


132

Java에서 이와 같은 것이 가능합니까? Java의 열거 형 요소에 사용자 정의 숫자 값을 지정할 수 있습니까?

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

열거 한 값 숫자 같은 직접 작성하지 않았지만 Ben S의 링크에 표시된 것처럼 간접적으로 가능합니다.
호버크라프트 가득한 뱀장어


@Benoit 나는 생각하지 않습니다 그것은 속임수입니다 : 하나는 첫 번째 값을 설정하고 거기에서 증가하는 것입니다. 이것은 모든 값을 설정하는 것입니다. 그러나 분명히 관련이 있습니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

답변:


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

2
@IgorGanapolsky, 특히 enum의 생성자는 public이 될 수 없습니다 : stackoverflow.com/questions/3664077/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

이것은 여전히 ​​gson과 함께 작동하며 json에서 변환됩니다.
Zapnologica

4
변수 "public final int numVal"을 선언하고 접근 자 메서드 없이도 EXIT_CODE.A.numVal (이름 'value'선호)로 직접 액세스 할 수 있습니다. 최종이므로 생성자에서만 설정할 수 있습니다. IMO는 약간 깨끗한 코드로 이어지지 만 대부분 선호하는 문제입니다. 최종 변수를 사용하면 하나의 분석법 정의가 저장됩니다.
Steve Ferguson

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

3
@IgorGanapolsky 예제를 독립적으로 만들기 위해 추측합니다!
mat_boy

2
@ IgorGanapolsky : 그것이 공식 문서에서 그런 방식이기 때문에 (
serv-inc

@ user1587329 흥미롭지 만 테스트 목적으로 만 사용됩니다. 프로덕션 릴리스 코드에서이를 사용하는 방법을
찾지 못했습니다

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;
    }   
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.