Comment convertir le résultat de chaîne de enum avec toString () surchargé en arrière?

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

Question

Étant donné le java enum suivant:

public enum AgeRange {

   A18TO23 {
        public String toString() {        
            return "18 - 23";
        }
    },
   A24TO29 {
        public String toString() {        
            return "24 - 29";
        }
    },
   A30TO35 {
        public String toString() {        
            return "30 - 35";
        }
    },

}

Existe-t-il un moyen de convertir une valeur de chaîne de "18 - 23"? à la valeur enum correspondante, c'est-à-dire AgeRange.A18TO23?

Merci!

Était-ce utile?

La solution

Le moyen le plus simple et le plus simple de procéder est le suivant:

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

Ensuite, il vous suffit d'appeler la méthode getByValue () avec l'entrée String correspondante.

Autres conseils

Vous pouvez toujours créer un mappage de chaîne en valeur - faites-le statiquement de manière à ne le mapper qu'une seule fois, en supposant que la chaîne renvoyée reste la même dans le temps. Il n'y a rien d'intégré à ma connaissance.

Selon l’article 30 de Java efficace (2e éd.), cela peut être (c’est beaucoup plus rapide que la boucle)

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

Ou quelque chose comme ça? Il suffit de taper, de ne pas avoir utilisé un compilateur. Pardonnez (commentez) les fautes de frappe ...

Ou utilisez une telle logique pour créer une carte une fois. Évitez les itérations lors de l'exécution. Bonne idée, Jon.

La classe remplace "toString ()". - donc, pour obtenir l'opération inverse, vous devez remplacer valueOf () pour traduire la sortie de toString () en valeurs Enum.

public enum AgeRange {

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

    .
    .
    .
}

Attention aux acheteurs - non compilés et non testés ...

Le mécanisme pour toString () et valueOf () est une partie documentée de API

Vous pourriez essayer quelque chose comme ce qui suit?

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

Ou, comme l'ont suggéré d'autres personnes, en utilisant une approche de mise en cache:

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top