재정의 toString ()로 Enum의 문자열 결과를 Enum으로 되돌리는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/240122

문제

다음 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);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top