2012-06-22 33 views
5

我有一個在Web服務實現中定義爲枚舉的帳戶類型列表。但是,當消費者調用Web服務時,它會傳遞一個需要轉換爲枚舉的字符串。驗證成功的字符串在Java中枚舉轉換

什麼是驗證給定的字符串將被成功轉換爲枚舉的好方法?

我正在使用以下方法,但這可能是濫用異常(根據Effective Java,第57項)。

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

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

看到這個線程,它有這個http://stackoverflow.com/questions/604424/java-convert-string-to-enum –

回答

0

您可以捕獲IllegalArgumentException,當給出錯誤的值時會拋出IllegalArgumentException。

+0

多種解決方案我修改了包含IllegalArgumentException的代碼..它仍然是例外,但 – Dima

+0

是的,它使用異常如何使用它們,而不是一個大的捕獲所有。我沒有看到你所指的「第57項」,但我假設他們說你應該在出現真正的錯誤時才拋出異常,在這種情況下,這是一個錯誤,你仍然無法避免因爲Java實現拋出這個錯誤。 –

1

你可以走了過來枚舉值,並檢查是否每個文字的名稱等於你的字符串像

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

枚舉是:

public enum Test { 
    A, 
    B, 
} 

你也可以返回枚舉常量或null,因爲枚舉通常很小,所以不會是性能問題。

+0

這實際上是行不通的,所以在第一次迭代時,如果str不等於Enum類型,那麼您將返回false,甚至認爲它可能仍然存在於數組中 – Dima

+0

如果深入瞭解,只有在數組的所有值都被檢查後,纔會發生「return false」語句,這是for語句完成時的情況。 –

0

使用Optional來自Guava的數據類型。

有你的方法AccountType.valueOf返回值類型Optional<AccountType>。然後利用現場代碼將變爲:

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

仍然看到這個令人討厭的例外。 – Dima

+0

什麼例外? – missingfaktor

+0

你是要創作'AccountType.valueOf'的人嗎?還是來自您正在使用的某些API? – missingfaktor

2

我本人來說從Apache共享庫中使用的EnumUtils

該庫包含許多有用的util類(例如對於字符串),並且是任何Java項目中必備的,並且很輕(300ko)。

下面是我用一個示例代碼:

TypeEnum strTypeEnum = null; 

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