Évitez d'utiliser une boucle pour effectuer la validation.
Je suggère d'utiliser valueOf
. Cette méthode est intégrée aux enums, et peut être envisagée pour une optimisation au moment de la compilation.
Cela reviendrait à mettre en œuvre un système statique Map<String,EnumType>
pour optimiser la recherche, une autre considération que vous pouvez prendre.
L'inconvénient est qu'il faudrait utiliser le mécanisme de traitement des exceptions pour attraper une valeur non numérique.
Exemple
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;
}
}
}
Notez également qu'avec l'implémentation du type ci-dessus, votre code est beaucoup plus propre lors de l'appel. Votre main ressemblerait maintenant à quelque chose comme :
public void main(){
String filter = "SIZE";
String action = "DELETE";
// ...
if (Filter.has(filter) && Action.has(action)) {
// Appropriate action
}
}
L'autre option mentionnée consiste à utiliser une carte statique. Vous pouvez utiliser une telle approche pour mettre en cache toute sorte d'indexation basée sur d'autres propriétés également. Dans l'exemple ci-dessous, j'autorise chaque valeur d'enum à avoir une liste de noms d'alias. L'index de recherche dans ce cas sera insensible à la casse, en forçant la majuscule.
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);
}
}
0 votes
Vous avez raison :) l'enum est juste une classe normale, vous ne pouvez pas mentionner son nom comme ça. Les membres d'enum sont des instances de leur enum, pas l'enum dans son ensemble.