재정의 toString ()로 Enum의 문자열 결과를 Enum으로 되돌리는 방법은 무엇입니까?
-
04-07-2019 - |
문제
다음 Java Enum을 감안할 때 :
public enum AgeRange {
A18TO23 {
public String toString() {
return "18 - 23";
}
},
A24TO29 {
public String toString() {
return "24 - 29";
}
},
A30TO35 {
public String toString() {
return "30 - 35";
}
},
}
"18-23"의 문자열 값을 해당 열거 값, 즉 agerange.a18to23으로 변환하는 방법이 있습니까?
감사!
해결책
가장 잘하는 가장 간단한 방법은 다음과 같습니다.
public enum AgeRange {
A18TO23 ("18-23"),
A24TO29 ("24-29"),
A30TO35("30-35");
private String value;
AgeRange(String value){
this.value = value;
}
public String toString(){
return value;
}
public static AgeRange getByValue(String value){
for (final AgeRange element : EnumSet.allOf(AgeRange.class)) {
if (element.toString().equals(value)) {
return element;
}
}
return null;
}
}
그런 다음 당신은 단지 그것을 호출하기 만하면됩니다 getByValue()
방법 String
입력.
다른 팁
당신은 항상 문자열에서 값으로 맵을 만들 수 있습니다 - 정적으로 그렇게하십시오. 따라서 반환 된 문자열이 시간이 지남에 따라 동일하게 유지된다고 가정 할 때 한 번만 매핑하면됩니다. 내가 알고있는 한 내장 된 것은 없습니다.
효과적인 Java (2nd ed) 항목 30에 따르면 (루프보다 훨씬 빠릅니다).
public enum AgeRange {
A18TO23("18-23"),
A24TO29("24-29"),
A30TO35("30-35");
private final String value;
AgeRange(String value){
this.value = value;
}
@Override public String toString(){
return value;
}
private static final Map<String, AgeRange> stringToEnum =
new HashMap<String, AgeRange>();
static {
for (AgeRange r : values()) {
stringToEnum.put(r.toString(), r);
}
}
public static AgeRange getByValue(String value){
return stringToEnum.get(value);
}
}
for (AgeRange ar: EnumSet.allOf(AgeRange)) {
if (ar.toString().equals(inString)) {
myAnswer = ar;
break;
}
}
아니면 그런 것? 방금 입력하고 컴파일러를 통과하지 못했습니다. 용서 (댓글) 오타 ...
또는 이와 같은 논리를 사용하여지도를 한 번 구축하십시오. 런타임에 반복을 피하십시오. 좋은 생각, 존.
클래스는 "toString ()"을 무시합니다. 따라서 역 작동을 얻으려면 재정의해야합니다. valueOf()
출력을 번역합니다 toString()
열거 값으로 돌아갑니다.
public enum AgeRange {
A18TO23 {
public String toString() {
return "18 - 23";
}
public AgeRange valueOf (Class enumClass, String name) {
return A18T023
}
},
.
.
.
}
구매자는 조심해 - 고려하지 않고 테스트되지 않은 ...
메커니즘 toString()
그리고 valueOf()
문서화 된 부분입니다 API
다음과 같은 것을 시도 할 수 있습니까?
static AgeRange fromString(String range) {
for (AgeRange ageRange : values()) {
if (range.equals(ageRange.toString())) {
return ageRange;
}
}
return null;
}
또는 다른 사람들이 제안한 것처럼 캐싱 접근법을 사용합니다.
private static Map<String, AgeRange> map;
private static synchronized void registerAgeRange(AgeRange ageRange) {
if (map == null) {
map = new HashMap<String, AgeRange>();
}
map.put(ageRange.toString(), ageRange);
}
AgeRange() {
registerAgeRange(this);
}
static AgeRange fromString(String range) {
return map.get(range);
}
제휴하지 않습니다 StackOverflow