Come convertire il risultato della stringa di enum con l'override toString () di nuovo in enum?

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

Domanda

Dato il seguente 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";
        }
    },

}

Esiste un modo per convertire un valore stringa di " 18 - 23 " al valore enum corrispondente, ad esempio AgeRange.A18TO23?

Grazie!

È stato utile?

Soluzione

Il modo migliore e più semplice per farlo è in questo modo:

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

Quindi devi solo invocare il metodo getByValue () con l'input String in esso.

Altri suggerimenti

Puoi sempre creare una mappa da stringa a valore: fallo staticamente, quindi devi mapparla una sola volta, supponendo che la stringa restituita rimanga la stessa nel tempo. Per quanto ne so, non c'è niente di integrato.

Secondo l'efficace java (2nd ed) voce 30, può essere (è molto più veloce del loop)

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

O qualcosa del genere? Appena inserito, non ho eseguito un compilatore. Perdona (commenta) errori di battitura ...

Oppure usa la logica in questo modo per costruire una mappa una volta. Evita iterazioni in fase di esecuzione. Buona idea, Jon.

La classe sovrascrive " toString () " - quindi, per ottenere l'operazione inversa, è necessario sovrascrivere valueOf () per tradurre l'output di inString () nei valori Enum.

public enum AgeRange {

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

    .
    .
    .
}

Attenzione dell'acquirente - non compilato e non testato ...

Il meccanismo per toString () e valueOf () è una parte documentata di API

Potresti provare qualcosa di simile al seguente?

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

Oppure, come altri hanno suggerito, utilizzando un approccio di memorizzazione nella 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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top