Comment vérifier si une chaîne donnée est une partie de tout Enum en Java?
J'ai deux différentes énumérations et je veux être en mesure de sortie si une
la chaîne est une partie d'un enum collection. c'est mon code:
public class Check {
public enum Filter{SIZE, DATE, NAME};
public enum Action{COPY, DELETE, REMOVE};
public boolean isInEnum(String value, Enum e){
//check if string value is a part of a given enum
return false;
}
public void main(){
String filter = "SIZE";
String action = "DELETE";
//check the strings
isInEnum(filter, Filter);
isInEnum(action, Action);
}
}
eclipse dit que dans les deux dernières lignes de "Filtre ne peut pas être résolu à une variable" mais
en dehors de cela, il semble que l'Enum param dans la fonction "isInEnum" est erroné.
Quelque chose est très mal ici, quelqu'un peut-il aider?
- Tu as bien fait 🙂 enum est juste une classe ordinaire, vous ne pouvez pas mentionner son nom comme ça. Enum mebers sont des instances de leur enum, pas l'enum dans son ensemble.
Vous devez vous connecter pour publier un commentaire.
Le plus simple (et généralement plus efficace) est comme suit:
et puis vous appelez
isInEnum(filter, Filter.class)
.enumClass.getMethod("valueOf", String.class).invoke(null, value)
?e.valueOf(value)
à la place. Notez également lors de l'utilisation de valueOf vous avez à les attraperIllegalArgumentException
si le nom n'existe pas etNullPointerException
si la chaîne est nullee
est un enum exemple -- je parle de l'appel de la statiquevalueOf
méthode que tous les enum class a. C'est la façon dont vous le faites normalement ce code, lorsque la réflexion n'est pas nécessaire.enum Filter
est en fait unpublic class Filter extends Enum<Filter>
. C'est la façon dont toutes les méthodes dans la classe Enum de travail pour chaque sous-classe.enumClass.valueOf(...)
try/catch
que vous avez à faire avecEnum.valueOf
si vous ne savez pas si la chaîne est l'une des valeurs de l'enum. J'ai dur chiffres à l'appui, si vous le souhaitez.valueOf
maintient un cache global deMap<String, Object>
pour chaque type enum, ce qui rend la constante de temps -- mais l'exception est tellement cher qu'il domine le coût dans presque tous les cas.public static <E extends Enum<E>> boolean isInEnum(String value, Class<E> enumClass) { return Arrays.asList(enumClass.getEnumConstants()).stream().anyMatch(e -> e.name().equals(value)); }
Si vous n'avez pas l'esprit à l'aide d'Apache commons lang3 bibliothèque, vous pouvez utiliser le code suivant:
Selon la docs :
Ici est un Java 8/flux version de Louis Wasserman réponse. (Vous pouvez aussi mettre cette méthode directement dans l'énumération de la classe, et de supprimer l'un des paramètres)
Je n'ai pas assez de points pour un commentaire sur Simon Tour de répondre directement, mais voici la méthode pour la deuxième manière, il a mentionné que va directement dans l'énumération de la classe elle-même:
Éviter l'utilisation d'une boucle pour procéder à la validation.
Je conseille
valueOf
. Cette méthode est intégrée dans les énumérations, et pourrait être considérée pour compiler l'optimisation du temps.Ce serait semblable à la mise en œuvre d'une statique
Map<String,EnumType>
pour optimiser la recherche, une autre considération que vous pouvez prendre.Inconvénient est que vous devez utiliser l'exception d'un mécanisme de gestion d'attraper un non-valeur d'enum.
Exemple
Également noter qu'avec le type décrit ci-dessus mise en œuvre, votre code est beaucoup plus propre lors de l'appel. Votre principale serait maintenant ressembler à quelque chose comme:
Puis l'autre option est d'utiliser une Carte statique. Vous pouvez employer une telle approche pour mettre en cache toutes sortes d'indexation basées sur d'autres propriétés. Dans l'exemple ci-dessous, j'autorise chaque valeur d'énumération d'une liste de noms d'alias. L'index de recherche, dans ce cas, être sensible à la casse, en forçant les majuscules.