Java 열거형에서 valueof() 및 toString()을 덮어씁니다.
나의 가치관은enum공백이 필요한 단어입니다만, 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) {}
}
}
열거형에서 Strings를 열거형 상수에 매핑하는 정적 Map을 사용할 수 있습니다.getEnum' 정적 메서드에서 사용합니다.그러면 String 값에서 enum을 가져올 때마다 enum을 반복할 필요가 없어집니다.
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 - 그 'Immmable Map' 타입은 Google guava API에서 가져온 것이며, 저는 이런 경우에 그것을 꼭 추천합니다.
편집 - 코멘트별:
- 이 솔루션에서는 할당된 각 문자열 값이 고유하고 늘이 아닌 것으로 가정합니다.열거형 작성자가 이를 제어할 수 있고 문자열이 일의 및 null이 아닌 열거형 값에 대응한다는 점을 고려하면 이는 안전한 제한으로 보입니다.
- 질문에서 요청한 대로 'toSTRING' 메서드를 추가했습니다.
Java 8의 실장은 어떻습니까?(늘은 기본 Enum으로 대체할 수 있습니다.)
public static RandomEnum getEnum(String value) {
return Arrays.stream(RandomEnum.values()).filter(m -> m.value.equals(value)).findAny().orElse(null);
}
또는 다음을 사용할 수 있습니다.
...findAny().orElseThrow(NotFoundException::new);
여기서부터의 가치 Of ('시작')를 얻을 수 있다고는 생각하지 않습니다.하지만 우주에 관한 한...다음을 시도합니다...
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){...}
언급URL : https://stackoverflow.com/questions/9662170/override-valueof-and-tostring-in-java-enum
'programing' 카테고리의 다른 글
| MAX(Column value), MYSQL에서 다른 열로 파티션을 선택한 행은 어떻게 해야 합니다. (0) | 2022.10.23 |
|---|---|
| Vuetify 그리드를 사용하여 v-for 루프의 저장소 항목을 표시하는 방법 (0) | 2022.10.23 |
| PHP - 두 배열이 동일한지 확인합니다. (0) | 2022.10.23 |
| 봄 3.0에 포함할 메이븐 종속성은 무엇입니까? (0) | 2022.10.22 |
| 대용량 텍스트 파일을 메모리에 로드하지 않고 한 줄씩 읽는 방법은 무엇입니까? (0) | 2022.10.22 |