Frage

In Anbetracht der folgenden 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";
        }
    },

}

Gibt es eine Möglichkeit, einen String-Wert zu konvertieren? „18 - 23“ an dem entsprechenden ENUM-Wert d AgeRange.A18TO23

Danke!

War es hilfreich?

Lösung

Die beste und einfachste Art und Weise zu tun, ist es wie folgt aus:

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;
    }
}

Dann brauchen Sie nur die getByValue() Methode mit dem String Eingang in sie aufzurufen.

Andere Tipps

Sie können immer eine Karte von Zeichenfolge, Wert schaffen - nicht so statisch, so dass Sie nur sie müssen einmal abzubilden, unter der Annahme, dass die zurückgegebenen String das gleiche im Laufe der Zeit bleibt. Es gibt nichts, Einbau soweit ich weiß.

Nach Effective Java (2nd ed) Artikel 30, kann es sein (es ist viel schneller als die Schleife)

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;
    }
}

oder so etwas? Gerade eingegeben, nicht durch einen Compiler laufen. Vergib (kommentiert) Tippfehler ...

oder benutzen Logik wie dieses eine Mal eine Karte zu bauen. Vermeiden Sie Iteration zur Laufzeit. Gute Idee, Jon.

Die Klasse überschreibt „toString ().“ - so die umgekehrte Operation zu erhalten, müssen Sie valueOf() außer Kraft zu setzen, die Ausgabe von toString() zurück zu den Enum-Werte zu übersetzen

public enum AgeRange {

   A18TO23 {
        public String toString() {        
                return "18 - 23";
        }
        public AgeRange valueOf (Class enumClass, String name) {
                return A18T023
        }
    },

    .
    .
    .
}

Käufer Vorsicht - nicht kompiliert und ungetestet ...

Der Mechanismus für toString() und valueOf() ist eine dokumentierte Teil der API

Man könnte so etwas wie die folgenden versuchen?

static AgeRange fromString(String range) {
    for (AgeRange ageRange : values()) {
        if (range.equals(ageRange.toString())) {
            return ageRange;
        }
    }
    return null;   
}

Oder, wie andere vorgeschlagen, einen Caching-Ansatz:

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top