検証を行うためにループを使用することは避けてください。
を使用することをお勧めしvalueOf
ます。このメソッドは列挙型に組み込まれており、コンパイル時の最適化を検討することができます。
これは、ルックアップを最適化するために静的を実装するのと似てMap<String,EnumType>
います。これは、他の考慮事項です。
欠点は、列挙型以外の値をキャッチするには、例外処理メカニズムを使用する必要があることです。
例
public enum DataType {
//...
static public boolean has(String value) {
if (value== null) return false;
try {
// In this implementation - I want to ignore the case
// if you want otherwise ... remove .toUpperCase()
return valueOf(value.toUpperCase());
} catch (IllegalArgumentException x) {
// the uggly part ...
return false;
}
}
}
また、上記のタイプの実装では、呼び出し時にコードがはるかにきれいに見えることにも注意してください。メインは次のようになります。
public void main(){
String filter = "SIZE";
String action = "DELETE";
// ...
if (Filter.has(filter) && Action.has(action)) {
// Appropriate action
}
}
次に、他の言及されたオプションは静的マップを使用することです。このようなアプローチを使用して、他のプロパティに基づいてあらゆる種類のインデックスをキャッシュすることもできます。以下の例では、各列挙値にエイリアス名のリストを含めることができます。この場合のルックアップインデックスは、大文字にすることにより、大文字と小文字を区別しません。
public enum Command {
DELETE("del","rm","remove"),
COPY("cp"),
DIR("ls");
private static final Map<String,Command> ALIAS_MAP = new HashMap<String,Command>();
static {
for (Command type:Command.values()) {
ALIAS_MAP.put(type.getKey().toUpper(),type);
for (String alias:type.aliases) ALIAS_MAP.put(alias.toUpper(),type);
}
}
static public boolean has(String value) {
return ALIAS_MAP.containsKey(value.toUpper());
}
static public Command fromString(String value) {
if (value == null) throw new NullPointerException("alias null");
Command command = ALIAS_MAP.get(value);
if (command == null) throw new IllegalArgumentException("Not an alias: "+value);
return command;
}
private List<String> aliases;
private Command(String... aliases) {
this.aliases = Arrays.asList(aliases);
}
}