Java에서 열거 형 시작 값을 설정할 수 있습니까?


194

나는 열거 형을 사용하여 몇 가지 상수를 만듭니다.

enum ids {OPEN, CLOSE};

OPEN 값은 0이지만 100으로 원합니다. 가능합니까?


@ScottF 열거 형을 사용하는 방법을 원하십니까?
Anish B.

가장 좋은 대답에는 열거 형 정의가 있습니다. 정의 된 열거 형이 코드에서 어떻게 사용되는지에 대한 예를 원합니다. 예를 들어 정의 된 ctor를 사용하여 특정 정수 값을 가진 열거 형 인스턴스를 만드는 방법은 무엇입니까?
ScottF

@ ScottF 내가 당신이라면,이 게시물에 현상금을 설정하는 대신 완전히 새로운 질문을 게시하고 싶습니다 ..... 또는 열거 형에 대한 문서를 읽으십시오. 그것에 대해 몇 가지 핵심 지식을 파악해야 할 것 같습니다.)
lealceldeiro

enum ids {OPEN = 100, CLOSE};?
Mr Oscar

답변:


307

Java 열거 형은 C 또는 C ++ 열거 형과 다르며 실제로는 정수 레이블입니다.

Java 열거 형은 클래스와 유사하게 구현되며 여러 속성을 가질 수도 있습니다.

public enum Ids {
    OPEN(100), CLOSE(200);

    private final int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
}

큰 차이점은 형식이 안전 하다는 것이므로 COLOR 열거 형을 SIZE 변수에 할당 할 필요가 없습니다.

자세한 내용은 http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html 을 참조 하십시오 .


귀하의 진술에 따라 배열 또는 무언가에 대한 색인에 대해 java를 사용하여 순차 정수 열거 형 (C ++ 열거 형과 유사한)을 작성하는 가장 좋은 방법은 다음과 같습니다. enum Ids {NAME (0), AGE (1 ), 높이 (2), 무게 (3); } 감사합니다 -bn
bn.

아마도, 특히 적분 값을 어딘가에 직렬화 한 경우.
lavinio

1
함수 에서이 열거 형을 사용하는 방법을 알려주시겠습니까?
버그

2
열거 형에 값을 설정할 수 없도록하는 Java 표준은 게으르다. 적어도 c #은 이것을 허용하며 타입 안전합니다.
csmith

2
FWIW, C ++ 11에는 이제 type-safe가 enum class있습니다.
피닉스

93

예. 다음과 같이 숫자 값을 열거 자 생성자에 전달할 수 있습니다.

enum Ids {
  OPEN(100),
  CLOSE(200);

  private int value;    

  private Ids(int value) {
    this.value = value;
  }

  public int getValue() {
    return value;
  }
}

자세한 내용은 Sun Java 언어 안내서 를 참조하십시오.


멋있는. 섞을 수 있습니까? 즉, 선택한 Enum 값에만 숫자를 할당하십시오.
Frederick Nord

비공개 수정자는 열거 형 생성자에 중복됩니다
Nino van Hooff

@FrederickNord-물론입니다. value(0)으로 초기화 되는 인수가없는 두 번째 개인 생성자를 추가하십시오 . 그런 다음 DANCE값 목록에 (예) 를 포함하십시오.
Stephen C

15

이 방법을 사용하는 것 :

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public int getColorValue() {
              switch (this) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }
}

하나의 방법이 있습니다 ..

정적 메소드를 사용하고 다음과 같이 Enum을 매개 변수로 전달할 수 있습니다.

public enum HL_COLORS{
          YELLOW,
          ORANGE;

          public static int getColorValue(HL_COLORS hl) {
              switch (hl) {
            case YELLOW:
                return 0xffffff00;
            case ORANGE:
                return 0xffffa500;    
            default://YELLOW
                return 0xffffff00;
            }
          }

이 두 가지 방법은 더 적은 메모리와 더 많은 프로세스 단위를 사용한다는 점에 유의하십시오. 이것이 최선의 방법이라고 말하지는 않지만 또 다른 접근법입니다.


1
getColorValue()두 번째 예에서 왜 동기화됩니까?
josaphatv

@josaphatv 두 번째 예의 모든 기능은 정적이며 변경되지 않습니다. HL_COLORS.getColorValue(HL_COLORS.YELLOW);열거 형을 초기화하지 않고 원할 수 있습니다 .
mazunki

11

매우 큰 열거 형을 사용하는 경우 다음이 유용 할 수 있습니다.

public enum deneme {

    UPDATE, UPDATE_FAILED;

    private static Map<Integer, deneme> ss = new TreeMap<Integer,deneme>();
    private static final int START_VALUE = 100;
    private int value;

    static {
        for(int i=0;i<values().length;i++)
        {
            values()[i].value = START_VALUE + i;
            ss.put(values()[i].value, values()[i]);
        }
    }

    public static deneme fromInt(int i) {
        return ss.get(i);
    }

    public int value() {
    return value;
    }
}

7

C / C ++ 열거 형 (기본 숫자 및 다음 증분)을 에뮬레이션하려면 다음을 수행하십시오.

enum ids {
    OPEN, CLOSE;
    //
    private static final int BASE_ORDINAL = 100;
    public int getCode() {
        return ordinal() + BASE_ORDINAL;
    }
};

public class TestEnum {
    public static void main (String... args){
        for (ids i : new ids[] { ids.OPEN, ids.CLOSE }) {
            System.out.println(i.toString() + " " + 
                i.ordinal() + " " + 
                i.getCode());
        }
    }
}
OPEN 0 100
CLOSE 1 101

4

ordinal () 함수는 열거 형에서 식별자의 상대 위치를 반환합니다. 이를 사용하면 C 스타일 열거 형과 마찬가지로 오프셋을 사용하여 자동 인덱싱을 얻을 수 있습니다.

예:

public class TestEnum {
    enum ids {
        OPEN,
        CLOSE,
        OTHER;

        public final int value = 100 + ordinal();
    };

    public static void main(String arg[]) {
        System.out.println("OPEN:  " + ids.OPEN.value);
        System.out.println("CLOSE: " + ids.CLOSE.value);
        System.out.println("OTHER: " + ids.OTHER.value);
    }
};

출력을 제공합니다.

OPEN:  100
CLOSE: 101
OTHER: 102

편집 : 이것은 ggrandes의 답변 과 매우 유사하다는 것을 깨달았 지만 C 스타일 열거 형에 도달 할 수있을만큼 깨끗하고 가깝기 때문에 여기에 남겨 두겠습니다.


이 예에서는 열거 형을 가져 와서 정수를 얻습니다. 당신이 반대를 표시 할 수 있습니다, int를 타고 열거와 끝까지 (각 값에 대한 명시 적 스위치 케이스없이?)
ScottF

질문에 따르면, 이것이 가장 적합한 답변이라고 생각합니다. 여기서 새 변수를 정의하고 생성자를 통해 할당하지 않고 enum의 기본 색인을 100에서 시작하도록 변경했습니다.
Rahul Jain

@RahulJain 나는 오히려 받아 들인 대답을 사용하려고합니다. 나에게 더 깨끗해 보인다.
lealceldeiro

1

scott

열거 형은 싱글 톤과 같습니다. JVM이 인스턴스를 작성합니다.

클래스를 사용하여 직접 만들면 다음과 같이 보일 수 있습니다.

public static class MyEnum {

    final public static MyEnum ONE;
    final public static MyEnum TWO;

    static {
        ONE = new MyEnum("1");
        TWO = new MyEnum("2");
    }

    final String enumValue;

    private MyEnum(String value){
        enumValue = value;    
    }

    @Override
    public String toString(){
        return enumValue;
    }


}

그리고 그렇게 사용될 수 있습니다 :

public class HelloWorld{

   public static class MyEnum {

       final public static MyEnum ONE;
       final public static MyEnum TWO;

       static {
          ONE = new MyEnum("1");
          TWO = new MyEnum("2");
       }

       final String enumValue;

       private MyEnum(String value){
           enumValue = value;    
       }

       @Override
       public String toString(){
           return enumValue;
       }


   }

    public static void main(String []args){

       System.out.println(MyEnum.ONE);
       System.out.println(MyEnum.TWO);

       System.out.println(MyEnum.ONE == MyEnum.ONE);

       System.out.println("Hello World");
    }
}

0
 public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     System.out.println(id1.getValue());
    }
}

enum Ids {
    OPEN(100), CLOSE(200);

    private final int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
}

@scottf, ENUM에 정의 된 생성자로 인해 혼동 될 수 있습니다.

설명해 드리겠습니다.

클래스를 class loader로드 하면 생성자도 호출됩니다. 에 무슨!! 예, 그것은에 대한라고 하고 . 어떤 값 에 대한 및 대한enumenumOPENclose100OPEN200close

다른 가치를 가질 수 있습니까?

예,

public class MyClass {
    public static void main(String args[]) {
     Ids id1 = Ids.OPEN;
     id1.setValue(2);
     System.out.println(id1.getValue());
    }
}

enum Ids {
    OPEN(100), CLOSE(200);

    private int id;
    Ids(int id) { this.id = id; }
    public int getValue() { return id; }
    public void setValue(int value) { id = value; }
}

그러나 나쁜 습관입니다. enum표현에 사용되는 constants것처럼 days of week, colors in rainbow미리 정의 된 상수의 예와 같은 작은 그룹.


0

C ++ 열거자를 보는 것이 혼란 스럽다고 생각합니다. Java 열거자는 다릅니다.

C / C ++ 열거 형에 익숙하다면 다음 코드를 사용하십시오.

public class TestEnum {
enum ids {
    OPEN,
    CLOSE,
    OTHER;

    public final int value = 100 + ordinal();
};

public static void main(String arg[]) {
    System.out.println("OPEN:  " + ids.OPEN.value);
    System.out.println("CLOSE: " + ids.CLOSE.value);
    System.out.println("OTHER: " + ids.OTHER.value);
}
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.