다음 열거 형이 주어지면 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 에서 int
s로 Enum
또는 그 반대로 변환하지 않는 것이 좋습니다 .
답변
이것은 일반적으로 수행되는 것이 아니므로 다시 고려할 것입니다. 그러나 기본 작업은 int-> EnumType.values () [intNum]을 사용하는 enum, enumInst.ordinal ()을 사용하는 enum-> int입니다.
그러나 values () 구현은 배열의 사본을 제공하는 것 외에는 선택의 여지가 없기 때문에 (자바 배열은 읽기 전용이 아닙니다) EnumMap을 사용하여 enum-> int 매핑을 캐시하는 것이 더 좋습니다.