[java] Int를 Java로 열거

다음 열거 형이 주어지면 Java에서 Int를 열거 형으로 캐스팅하는 올바른 방법은 무엇입니까?

public enum MyEnum
{
    EnumValue1,
    EnumValue2
}


MyEnum enumValue = (MyEnum) x; //Doesn't work???



답변

시도 MyEnum.values()[x]x이어야 0또는 1그 열거에 대한 올바른 순서, 즉.

Java 열거 형은 실제로 클래스이며 따라서 열거 형 값은 객체이므로 열거 형 int또는 캐스트 Integer형을 캐스팅 할 수 없습니다 .


답변

MyEnum.values()[x]비싼 작업입니다. 성능이 문제가된다면 다음과 같이 할 수 있습니다.

public enum MyEnum {
    EnumValue1,
    EnumValue2;

    public static MyEnum fromInteger(int x) {
        switch(x) {
        case 0:
            return EnumValue1;
        case 1:
            return EnumValue2;
        }
        return null;
    }
}


답변

정수 값을 지정하려면 다음과 같은 구조를 사용할 수 있습니다

public enum A
{
        B(0),
        C(10),
        None(11);
        int id;
        private A(int i){id = i;}

        public int GetID(){return id;}
        public boolean IsEmpty(){return this.equals(A.None);}
        public boolean Compare(int i){return id == i;}
        public static A GetValue(int _id)
        {
            A[] As = A.values();
            for(int i = 0; i < As.length; i++)
            {
                if(As[i].Compare(_id))
                    return As[i];
            }
            return A.None;
        }
}


답변

이렇게 시도해 볼 수 있습니다.
요소 ID로 클래스를 작성하십시오.

      public Enum MyEnum {
        THIS(5),
        THAT(16),
        THE_OTHER(35);

        private int id; // Could be other data type besides int
        private MyEnum(int id) {
            this.id = id;
        }

        public static MyEnum fromId(int id) {
                for (MyEnum type : values()) {
                    if (type.getId() == id) {
                        return type;
                    }
                }
                return null;
            }
      }

이제 id를 int로 사용하여이 Enum을 가져옵니다.

MyEnum myEnum = MyEnum.fromId(5);


답변

값을 캐시하고 간단한 정적 액세스 방법을 만듭니다.

public static enum EnumAttributeType {
    ENUM_1,
    ENUM_2;
    private static EnumAttributeType[] values = null;
    public static EnumAttributeType fromInt(int i) {
        if(EnumAttributeType.values == null) {
            EnumAttributeType.values = EnumAttributeType.values();
        }
        return EnumAttributeType.values[i];
    }
}


답변

Java 열거 형에는 C ++에서와 같은 종류의 열거 형 매핑이 없습니다.

즉, 모든 열거 형에는 values가능한 열거 형 값의 배열을 반환하는 메서드가 있으므로

MyEnum enumValue = MyEnum.values()[x];

작동해야합니다. 그것은 조금 불쾌하고 가능한 경우 s 에서 ints로 Enum또는 그 반대로 변환하지 않는 것이 좋습니다 .


답변

이것은 일반적으로 수행되는 것이 아니므로 다시 고려할 것입니다. 그러나 기본 작업은 int-> EnumType.values ​​() [intNum]을 사용하는 enum, enumInst.ordinal ()을 사용하는 enum-> int입니다.

그러나 values ​​() 구현은 배열의 사본을 제공하는 것 외에는 선택의 여지가 없기 때문에 (자바 배열은 읽기 전용이 아닙니다) EnumMap을 사용하여 enum-> int 매핑을 캐시하는 것이 더 좋습니다.