내 값 enum
은 공백이 있어야하는 단어이지만 열거 형은 값에 공백을 포함 할 수 없으므로 모두 묶여 있습니다. 내가 toString()
말하는 곳에 이러한 공간을 추가 하도록 재정의하고 싶습니다 .
또한 valueOf()
공백을 추가 한 동일한 문자열에서 사용할 때 열거 형이 올바른 열거 형을 제공하기를 원합니다 .
예를 들면 :
public enum RandomEnum
{
StartHere,
StopHere
}
전화 toString()
에 RandomEnum
그 값이 StartHere
반환 문자열 "Start Here"
. valueof()
동일한 문자열 ( "Start Here"
) 을 호출 하면 열거 형 값이 반환 StartHere
됩니다.
어떻게 할 수 있습니까?
답변
이 코드를 사용해 볼 수 있습니다. valueOf
메서드를 재정의 할 수 없으므로 getEnum
필요한 값을 반환하고 대신이 메서드를 사용하도록 클라이언트를 변경 하는 사용자 지정 메서드 ( 아래 샘플 코드에서) 를 정의 해야합니다.
public enum RandomEnum {
StartHere("Start Here"),
StopHere("Stop Here");
private String value;
RandomEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return this.getValue();
}
public static RandomEnum getEnum(String value) {
for(RandomEnum v : values())
if(v.getValue().equalsIgnoreCase(value)) return v;
throw new IllegalArgumentException();
}
}
답변
이것을 시도하지만 그것이 모든 곳에서 작동하는지 확신하지 못합니다 🙂
public enum MyEnum {
A("Start There"),
B("Start Here");
MyEnum(String name) {
try {
Field fieldName = getClass().getSuperclass().getDeclaredField("name");
fieldName.setAccessible(true);
fieldName.set(this, name);
fieldName.setAccessible(false);
} catch (Exception e) {}
}
}
답변
열거 형 상수에 문자열을 매핑하는 정적 맵을 열거 형에 사용할 수 있습니다. ‘getEnum’정적 메소드에서 사용하십시오. 이렇게하면 문자열 값에서 하나를 가져 오려고 할 때마다 열거 형을 반복 할 필요가 없습니다.
public enum RandomEnum {
StartHere("Start Here"),
StopHere("Stop Here");
private final String strVal;
private RandomEnum(String strVal) {
this.strVal = strVal;
}
public static RandomEnum getEnum(String strVal) {
if(!strValMap.containsKey(strVal)) {
throw new IllegalArgumentException("Unknown String Value: " + strVal);
}
return strValMap.get(strVal);
}
private static final Map<String, RandomEnum> strValMap;
static {
final Map<String, RandomEnum> tmpMap = Maps.newHashMap();
for(final RandomEnum en : RandomEnum.values()) {
tmpMap.put(en.strVal, en);
}
strValMap = ImmutableMap.copyOf(tmpMap);
}
@Override
public String toString() {
return strVal;
}
}
맵의 정적 초기화가 열거 형 상수 선언 아래에서 발생하는지 확인하십시오.
BTW- ‘ImmutableMap’유형은 Google 구아바 API에서 가져온 것이며, 이런 경우에는 확실히 추천합니다.
편집-댓글에 따라 :
- 이 솔루션은 할당 된 각 문자열 값이 고유하고 null이 아니라고 가정합니다. 열거 형의 작성자가 이것을 제어 할 수 있고 문자열이 고유하고 null이 아닌 열거 형 값에 해당한다는 점을 감안할 때 이것은 안전한 제한처럼 보입니다.
- 질문에서 요청한대로 ‘toSTring ()’메서드를 추가했습니다.
답변
Java 8 구현은 어떻습니까? (null은 기본 Enum으로 바꿀 수 있습니다)
public static RandomEnum getEnum(String value) {
List<RandomEnum> list = Arrays.asList(RandomEnum.values());
return list.stream().filter(m -> m.value.equals(value)).findAny().orElse(null);
}
또는 다음을 사용할 수 있습니다.
...findAny().orElseThrow(NotFoundException::new);
답변
나는 당신이 valueOf ( “Start Here”)를 작동시킬 것이라고 생각하지 않는다. 그러나 공백에 관해서는 … 다음을 시도하십시오 …
static private enum RandomEnum {
R("Start There"),
G("Start Here");
String value;
RandomEnum(String s) {
value = s;
}
}
System.out.println(RandomEnum.G.value);
System.out.println(RandomEnum.valueOf("G").value);
Start Here
Start Here
답변
다음은 valueOf ()에 대한 좋은 일반적인 대안입니다.
public static RandomEnum getEnum(String value) {
for (RandomEnum re : RandomEnum.values()) {
if (re.description.compareTo(value) == 0) {
return re;
}
}
throw new IllegalArgumentException("Invalid RandomEnum value: " + value);
}
답변
열거 형에서 구현할 수있는 옵션이 여전히 있습니다.
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name){...}
