2012-06-22 59 views
5

Tengo una lista de tipos de cuentas definidos como enumeraciones en la implementación de servicios web. Sin embargo, cuando el consumidor llama al servicio web, pasa un String que debe convertirse a enum.Validar la conversión exitosa de String to enum en Java

¿Cuál es una buena forma de validar que una cadena determinada se convertirá con éxito en enumeración?

Estaba usando el siguiente enfoque, pero esto probablemente sea un abuso de excepciones (según Effective Java, artículo 57).

AccountType accountType = null; 
try{ 
    accountType = AccountType.valueOf(accountTypeString); 
}catch(IllegalArgumentException e){ 
    // report error 
} 

if (accountType != null){ 
    // do stuff 
}else{ 
    // exit 
} 
+1

ver este hilo, que tiene varias soluciones para este http://stackoverflow.com/questions/604424/java-convert-string-to-enum –

Respuesta

0

Puede capturar IllegalArgumentException, que se lanzará cuando se proporcione un valor incorrecto.

+0

Modifiqué el código para incluir IllegalArgumentException ... aún lo es y excepciones a través de – Dima

+0

Sí, está usando excepciones de cómo deberían usarse, no como una gran trampa para todos. No he visto el "artículo 57" al que se refiere, pero asumo que dicen que solo debe lanzar una excepción cuando hay un error real, en este caso es un error y no se puede evitar de todos modos porque la implementación de Java está arrojando ese error. –

1

usted podría ir a través de los valores de enumeración y comprobar si el nombre de cada literal es igual a su cadena como

for (Test test : Test.values()) { 
    if (str.equals(test.name())) { 
     return true; 
    } 
} 
return false; 

La enumeración es:

public enum Test { 
    A, 
    B, 
} 

También se podría devolver la enumeración constante o nulo, ya que las enumeraciones suelen ser pequeñas, no será un problema de rendimiento.

+0

esto no funcionará en realidad, así que en la primera iteración si str no pasa a ser igual al tipo Enum, se devolverá falso, incluso si aún estuviera presente en la matriz – Dima

+0

Si se mira más profundamente, el La declaración "return false" solo ocurrirá una vez que se hayan marcado todos los valores en la matriz, esto es, cuando finalice la instrucción for. –

0

Use Optional tipo de dato de Guava.

Haga que su método AccountType.valueOf devuelva el valor de tipo Optional<AccountType>. A continuación, el código de uso in situ se convertiría en:

Optional<AccountType> accountType = AccountType.valueOf(accountTypeString)); 
if (accountType.isPresent()) { 
    AccountType a = accountType.get(); 
    // do stuff 
} else { 
    // exit 
} 
+0

sigue viendo esta molesta excepción .. – Dima

+0

¿Qué excepción? – missingfaktor

+0

¿Eres tú el autor del 'AccountType.valueOf'? ¿O es de alguna API que estás consumiendo? – missingfaktor

2

personalmente he utilizado la EnumUtils de la biblioteca Apache Commons.

Esa biblioteca contiene muchas clases útiles de utilidad (por ejemplo, para cadenas también) y es imprescindible en cualquier proyecto de Java y bastante ligera (300ko).

Aquí hay un código de ejemplo que utilizo:

TypeEnum strTypeEnum = null; 

// test if String str is compatible with the enum 
if(EnumUtils.isValidEnum(TypeEnum.class, str)){ 
    strTypeEnum = TypeEnum.valueOf(str); 
}