5

Webサービスの実装で列挙型として定義されているアカウントタイプのリストがあります。ただし、コンシューマーがWebサービスを呼び出すと、列挙型に変換する必要のある文字列が渡されます。

指定された文字列が列挙型に正常に変換されることを検証するための良い方法は何ですか?

私は次のアプローチを使用していましたが、これはおそらく例外の悪用です(Effective Java、アイテム57による)。

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

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

4 に答える 4

2

個人的には、Apache Commons ライブラリのEnumUtilsを使用しました。

そのライブラリには、多くの便利なユーティリティ クラスが含まれており (たとえば、文字列にも)、Java プロジェクトに必須であり、非常に軽量 (300ko) です。

私が使用するサンプルコードは次のとおりです。

TypeEnum strTypeEnum = null;

// test if String str is compatible with the enum 
if( EnumUtils.isValidEnum(TypeEnum.class, str) ){
    strTypeEnum = TypeEnum.valueOf(str);
}
于 2013-03-01T12:58:04.130 に答える
2

列挙値を調べて、各リテラルの名前が次のような文字列と等しいかどうかを確認できます

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

列挙型は次のとおりです。

public enum Test {
    A,
    B,
}

また、列挙型定数または null を返すこともできます。列挙型は通常小さいため、パフォーマンスの問題にはなりません。

于 2012-06-22T20:01:23.833 に答える
1

不正な値が指定されたときにスローされる IllegalArgumentException をキャッチできます。

于 2012-06-22T19:52:49.907 に答える
0

OptionalGuavaのデータ型を使用します。

メソッドAccountType.valueOfにタイプの戻り値を持たせますOptional<AccountType>。次に、使用サイトコードは次のようになります。

Optional<AccountType> accountType = AccountType.valueOf(accountTypeString));
if (accountType.isPresent()) {
  AccountType a = accountType.get();
  // do stuff
} else {
  // exit
}
于 2012-06-22T20:54:00.573 に答える