2012-06-22 7 views
5

Ich habe eine Liste von Konten Typen definiert als enums in der Web-Service-Implementierung. Beim Webservice für Consumer-Aufrufe übergibt es jedoch einen String, der in enum konvertiert werden muss.Validieren Sie erfolgreich String zu Enum-Konvertierung in Java

Was ist eine gute Möglichkeit zu überprüfen, ob der angegebene String erfolgreich in enum konvertiert wird?

Ich verwendete den folgenden Ansatz, aber dies ist wahrscheinlich ein Missbrauch von Ausnahmen (nach Effective Java, Punkt 57).

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

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

dieses Themas Siehe, es hat mehrere Lösungen für dieses http://stackoverflow.com/questions/604424/java-convert-string-to-enum –

Antwort

0

Sie können IllegalArgumentException abfangen, die ausgelöst wird, wenn ein ungültiger Wert angegeben wird.

+0

Ich änderte Code, um IllegalArgumentException einzuschließen. Es ist still und Ausnahmen obwohl – Dima

+0

Ja, es benutzt Ausnahmen, wie sie benutzt werden sollten, nicht als ein großer Fang alle. Ich habe "Punkt 57" nicht erwähnt, aber ich nehme an, dass sie sagen, dass Sie nur eine Exception auslösen sollten, wenn es einen echten Fehler gibt, in diesem Fall ist es ein Fehler und Sie könnten es trotzdem nicht vermeiden weil die Java-Implementierung diesen Fehler verursacht. –

1

Sie über die ENUM-Werte gehen und prüfen, ob der Name jedes wörtliche gleich die Zeichenfolge so etwas wie

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

ENUM ist:

public enum Test { 
    A, 
    B, 
} 

Auch könnten Sie die Enum zurückkehren Konstante oder Null, da Enums normalerweise klein sind, ist dies kein Leistungsproblem.

+0

das ist eigentlich nicht funktionieren, so auf der ersten Iteration, wenn str nicht gleich dem Enum-Typ sein wird, werden Sie falsch zurück, auch wenn es noch im Array vorhanden sein könnte – Dima

+0

Wenn Sie einen tieferen Blick, die Die Anweisung "return false" wird nur dann ausgeführt, wenn alle Werte im Array überprüft wurden, dh wenn die for-Anweisung abgeschlossen ist. –

0

Verwenden Sie Optional Datentyp von Guava.

Haben Sie Ihre Methode AccountType.valueOf Rückgabewert des Typs Optional<AccountType>. Dann wird der Einsatz-Site-Code würde:

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

immer noch diese lästige Ausnahme .. – Dima

+0

Welche Ausnahme? – missingfaktor

+0

Sind Sie derjenige, der 'AccountType.valueOf' verfasst? Oder ist es von einer API, die Sie verbrauchen? – missingfaktor

2

Ich benutzte personaly die EnumUtils von der Apache Commons Bibliothek.

Diese Bibliothek enthält viele nützliche Util-Klassen (z. B. auch für Strings) und ist ein Muss in jedem Java-Projekt und ziemlich leicht (300ko).

Hier ist ein Beispielcode ist ich benutze:

TypeEnum strTypeEnum = null; 

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