int 값과 연결된 열거형 가져오기
이전에는 LegNo enums를 다음과 같이 정의했습니다.
NO_LEG, LEG_ONE, LEG_TWO
그리고 전화를 해서return LegNo.values()[i];
각 열거형과 관련된 값을 얻을 수 있었습니다.
하지만 이제 나는 내가 원하는 것은LegNo
열거하다NO_LEG
0 대신 int-1이 되기 때문에 개인 컨스트럭터를 사용하여 int 값을 초기화 및 설정하기로 결정했습니다.
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private LegNo(final int leg) { legNo = leg; }
지금 유일한 것은 내가 이렇게 하고 있기 때문에values()
에는 메서드가 동작하지 않습니다.NO_LEG
enum. int와 관련된 enum을 가져오려면 어떻게 해야 합니까?case switch 스테이트먼트 또는 if-elseif-elseif 를 사용하는 것 외에 효율적인 방법이 있습니까?
열거형에서 int 값을 얻는 데 필요한 SO 질문이 많이 있지만, 그 반대입니다.
2018년 8월 편집
오늘 나는 이것을 다음과 같이 구현한다.
public enum LegNo {
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private final int value;
LegNo(int value) {
this.value = value;
}
public static Optional<LegNo> valueOf(int value) {
return Arrays.stream(values())
.filter(legNo -> legNo.value == value)
.findFirst();
}
}
열거형 내에서 매핑을 유지해야 합니다.
public enum LegNo {
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private int legNo;
private static Map<Integer, LegNo> map = new HashMap<Integer, LegNo>();
static {
for (LegNo legEnum : LegNo.values()) {
map.put(legEnum.legNo, legEnum);
}
}
private LegNo(final int leg) { legNo = leg; }
public static LegNo valueOf(int legNo) {
return map.get(legNo);
}
}
스태틱 블록은 한 번만 호출되므로 성능 문제는 거의 없습니다.
편집: 메서드의 이름을 다음으로 변경했습니다.valueOf
다른 Java 클래스와 더 인라인이기 때문입니다.
모든 멤버를 반복하여 올바른 멤버를 반환하는 정적 메서드를 열거형에 포함할 수도 있습니다.
public enum LegNo {
NO_LEG(-1),
LEG_ONE(1),
LEG_TWO(2);
private int legIndex;
private LegNo(int legIndex) { this.legIndex = legIndex; }
public static LegNo getLeg(int legIndex) {
for (LegNo l : LegNo.values()) {
if (l.legIndex == legIndex) return l;
}
throw new IllegalArgumentException("Leg not found. Amputated?");
}
}
이제 Enum 값을 정수로 가져오려면 다음을 사용합니다.
int myLegIndex = 1; //expected : LEG_ONE
LegNo myLeg = LegNo.getLeg(myLegIndex);
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toMap;
import java.util.Map;
public enum LegNo {
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private final int legNo;
private final static Map<Integer, LegNo> map =
stream(LegNo.values()).collect(toMap(leg -> leg.legNo, leg -> leg));
private LegNo(final int leg) {
legNo = leg;
}
public static LegNo valueOf(int legNo) {
return map.get(legNo);
}
}
또한 Enum LegNo에서 values() 메서드를 호출하는 것만으로 지정된 정수값에 대응하는 Enum 값에 액세스할 수 있습니다.LegNo enums 필드를 반환합니다. LegNo.values()[0]; //returns LEG_NO LegNo.values()[1]; //returns LEG_ONE LegNo.values()[2]; //returns LEG_TWO
정확히 그가 찾던 것은 아니지만, 매우 가깝고 매우 단순하다. (이 주제는 죽었지만 다른 사람에게 유용할 수 있다.)
Java 8 way(기본값):
public enum LegNo {
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private final int legNo;
LegNo(int legNo) {
this.legNo = legNo;
}
public static LegNo find(int legNo, Supplier<? extends LegNo> byDef) {
return Arrays.asList(LegNo.values()).stream()
.filter(e -> e.legNo == legNo).findFirst().orElseGet(byDef);
}
}
문의처:
LegNo res = LegNo.find(0, () -> LegNo.NO_LEG);
또는 예외:
LegNo res = LegNo.find(0, () -> {
throw new RuntimeException("No found");
});
public enum LegNo {
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private final int code;
LegNo(int code) {
this.code = code;
ReverseStorage.reverseMap.put(code, this);
}
public static Optional<LegNo> getByCode(int code) {
return Optional.ofNullable(ReverseStorage.reverseMap.get(code));
}
private static final class ReverseStorage {
private static final Map<Integer, LegNo> reverseMap = new LinkedHashMap<>();
}
}
열거형에는 3개의 요소만 포함되어 있으므로, 가장 빠른 방법은 일련의 요소를 사용하는 것입니다.if else
제안하신 대로요
edit: adarshr가 제공한 답변은 열거값이 많은 일반적인 경우에 더 적합하지만, 당신의 문제에는 과잉이라고 생각합니다.
public enum LegNo {
NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);
private int legNo;
private LegNo(int leg) { legNo = leg; }
public static LegNo valueOf(int legNo) {
for (LegNo leg : LegNo.values()) {
if (leg.legNo == legNo) return leg;
}
}
}
assert LegNo.valueOf(2) == LegNo.LEG_TWO
assert LegNo.valueOf(3) == null
언급URL : https://stackoverflow.com/questions/11047756/getting-enum-associated-with-int-value
'programing' 카테고리의 다른 글
잘못된 매직 넘버 오류는 무엇입니까? (0) | 2022.10.26 |
---|---|
Class.newInstance()가 "evil"인 이유는 무엇입니까? (0) | 2022.10.26 |
Larabel MariaDB errno:150 "외부 키 제약조건이 잘못 형성되었습니다" (0) | 2022.10.26 |
이벤트 대상을 클릭하면 상위 요소가 아닌 요소 또는 하위 요소가 표시됩니다. (0) | 2022.10.06 |
JavaScript와 ECMAScript의 차이점은 무엇입니까? (0) | 2022.10.06 |