Quel est le moyen le plus simple et / ou le plus court possible d'obtenir les noms des éléments enum sous forme de tableau de String
s?
Ce que je veux dire par là, c'est que si, par exemple, j'avais l'énumération suivante:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
public static String[] names() {
// ...
}
}
la names()
méthode renverrait le tableau { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }
.
Réponses:
Voici une ligne pour toutes les
enum
classes:Pre Java 8 est toujours un one-liner, bien que moins élégant:
Que vous appelleriez comme ceci:
Si vous voulez juste quelque chose de simple pour une classe enum codée en dur:
la source
e.getEnumConstants()
vous pouvez utiliserYourEnumName.values()
YourEnumName.values()
appelle une méthode statique sur la classe, qui ne peut être réutilisée pour aucune énumération. Utilisation degetEnumConstants()
travaux pour n'importe quelle classe enum. L'idée avec cette méthode est de recréer une méthode utilitaire que vous pouvez appeler comme la dernière ligne de la réponse.Class<? extends Enum<?>> e
?Créez un
String[]
tableau pour les noms et appelez lavalues()
méthode statique qui renvoie toutes les valeurs d'énumération, puis parcourez les valeurs et remplissez le tableau de noms.la source
values()
13 fois, générant un nouveau tableau à chaque fois, au lieu de mettre le tableau en cache dans une variable locale? Pourquoi utiliser toString (), qui est remplaçable, au lieu dename()
?name()
méthode jusqu'à maintenant. comment stupide de ma part: P merci de me l'avoir fait savoir :)Voici une solution élégante utilisant Apache Commons Lang 3 :
Bien qu'il renvoie une liste, vous pouvez convertir la liste facilement avec
list.toArray()
la source
EnumUtils.getEnumList(enumClass)
renvoie les valeurs d'énumération, pas les chaînes. Vous pouvez utiliserEnumUtils.getEnumMap(enumClass).keySet()
, mais l'ordre peut être différent.Si vous pouvez utiliser Java 8, cela fonctionne bien (alternative à la suggestion de Yura, plus efficace):
la source
Avec java 8:
la source
Je l'écrirais comme ça
la source
Quelque chose comme ça ferait:
La documentation recommande d'utiliser
toString()
au lieu dename()
dans la plupart des cas , mais vous avez explicitement demandé le nom ici.la source
values()
est appelé deux fois lorsqu'il ne doit être appelé qu'une seule fois.values()
est une méthode générée par le compilateur, donc je suppose qu'elle est assez optimisée. Enfin, je me souviens avoir lu quelque part que les boucles for-each sont plus efficaces que les boucles for standard, incrémentielles, mais là encore, cela n'a pas d'importance .for (int i = 0; i < a.length; i++) /* do stuff */;
Dans ce cas, les boucles for-each sont , en fait, plus efficaces. Une recherche rapide de SO sur le sujet nous donne ceci: stackoverflow.com/questions/2113216/…Un autre moyen:
Premier
Autre façon
la source
toString()
fonctionne, mais dans le cas général, ce n'est pas le cas, cartoString()
peut être remplacé. Utilisez.name()
pour obtenir de manière fiable le nom de l'instance sous forme de chaîne.Ma solution, avec manipulation de chaînes (pas la plus rapide, mais compacte):
la source
Je le ferais de cette façon (mais je ferais probablement des noms un ensemble non modifiable au lieu d'un tableau):
la source
names()
méthode n'est appelée qu'avec parcimonie, je pense que générer un tableau sur place est bien.J'ai le même besoin et j'utilise une méthode générique (à l'intérieur d'une classe ArrayUtils):
Et définissez simplement un STATIC à l'intérieur de l'énumération ...
Les énumérations Java manquent vraiment les méthodes names () et get (index), elles sont vraiment utiles.
la source
la manière ordinaire (jeu de mots):
la source
J'ai fait un petit test sur la solution de @ Bohemian. Les performances sont meilleures lorsque vous utilisez une boucle naïve à la place.
la source
org.apache.commons.lang3.EnumUtils.getEnumMap (State.class) .keySet ()
la source
EnumUtils
?Si vous voulez le plus court, vous pouvez essayer
la source
vales()
fois)Juste une pensée: peut-être que vous n'avez pas besoin de créer une méthode pour renvoyer les valeurs de l'énumération sous forme de tableau de chaînes.
Pourquoi avez-vous besoin du tableau de chaînes? Peut-être que vous n'avez besoin de convertir les valeurs que lorsque vous les utilisez, si jamais vous en avez besoin.
Exemples:
la source
Une autre façon de le faire dans Java 7 ou une version antérieure serait d'utiliser Guava:
la source
Essaye ça:
la source
Vous pouvez mettre des valeurs d'énumération dans une liste de chaînes et les convertir en tableau:
la source
Le moyen le plus simple:
Où la catégorie est le
Enum
nomla source