를 공유 나는 다음과 같은 열거이 : 잘 작동열거 형 정적 룩업 방법
public enum MyEnum{
A(10, "First"), //
B(20, "Second"), //
C(35, "Other options");
private Integer code;
private String description;
private MyEnum(Integer code, String description) {
this.code = code;
this.description = description;
}
public Integer getCode() {
return code;
}
public String getDescription() {
return description;
}
public static MyEnum getValueOf(Integer code) {
for (MyEnum e : MyEnum.values()) {
if (e.getCode().equals(code)) {
return e;
}
}
throw new IllegalArgumentException("No enum const " + MyEnum.class.getName() + " for code \'" + code
+ "\'");
}
}
합니다. getValueOf
-method는 외부 파트너와 통신 할 때 (선택한) 코드 만 가져 오기 때문에 존재합니다. GUI에 의미있는 구문을 표시해야하기 때문에 설명이 필요합니다.
하지만 지금은 비슷한 enum 클래스가 있습니다. 모두 자신의 코드 & 설명을 가지고 있으며 동일한 조회 기능이 필요합니다. getValueOf
-method가 제네릭이어야하므로 기본적으로 동일한 방법으로 30 개 이상의 다른 enum을 지원할 필요가 없습니다.
이 문제를 해결하기 위해이 메서드를 정의하고 일부 일반적인 로직을 구현하는 추상 클래스를 만들고 싶었지만 Enum
을 확장 할 수 없기 때문에 불가능합니다.
public static <T extends Enum<T>> T getValueOf(Enum<T> type, Integer code) {...}
그러나 열거 형과 제네릭 혼란과 나는이 작업을 진행하는 방법을 이해하지 않습니다
그런 다음 나는 다음과 같은 방법으로 유틸리티 클래스를 만들기 위해 노력했다.기본적으로 알고 싶은 것은 다음과 같습니다. 열거 형에 공통적 인 유틸리티를 정의하는 좋은 방법은 무엇입니까?
참고로, 위의 경우 getCode가 null을 반환하는 경우 NPE가 throw 될 수 있습니다. null을 조건으로 'if'체크를 할 것입니다. –
@ JohnB, 참으로. 나는 OP에서 코드를 복사하고 그것을 향상시키기 위해 노력하지 않았다. null 체크 대신에,'code'의 타입을'int'로 변경하여 새도우의 문제를 제거 할 수 있습니다. –
나는 이것을 실제로 가져 와서 내 자신의 유틸리티 프로젝트에 포함 시켰습니다. 메소드가'public static 이되도록''Encodable' generic을 만들었습니다. getValueOf (Class enumClass, U code)'괜찮 았으면 좋겠다. –