Evite utilizar un bucle para realizar la validación.
Yo sugeriría usar valueOf
. Este método está incorporado en las enumeraciones y podría considerarse para la optimización del tiempo de compilación.
Esto sería similar a implementar un Map<String,EnumType>
estático para optimizar la búsqueda, otra consideración que puede tomar.
El inconveniente es que tendría que usar el mecanismo de manejo de excepciones para capturar un valor que no sea enum.
Ejemplo
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;
}
}
}
También tenga en cuenta que con la implementación del tipo anterior, su código es mucho más limpio al llamar. Su principal ahora se vería así:
public void main(){
String filter = "SIZE";
String action = "DELETE";
// ...
if (Filter.has(filter) && Action.has(action)) {
// Appropriate action
}
}
Luego, la otra opción mencionada es utilizar un Mapa estático. Puede emplear dicho enfoque para almacenar en caché todo tipo de indexación en función de otras propiedades también. En el ejemplo siguiente, permito que cada valor enum tenga una lista de nombres de alias. El índice de búsqueda en este caso será insensible a mayúsculas y minúsculas, forzando a mayúsculas.
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);
}
}
Tienes ese derecho :) enum es solo una clase normal, no puedes mencionar su nombre así. Enum mebers son instancias de su enumeración, no la enumeración como un todo. –