À l'aide de représentations de chaîne de valeurs enum en cas de commutateur
Pourquoi il n'est pas possible d'utiliser les valeurs de l'enum comme des chaînes de caractères dans un commutateur cas? (Ou ce qui est mal avec cela:)
String argument;
switch (argument) {
case MyEnum.VALUE1.toString(): //Isn't this equal to "VALUE1" ?
//something
break;
case MyEnum.VALUE2.toString():
//something else
break;
OriginalL'auteur Bloke | 2012-04-30
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez utiliser que des chaînes qui sont connus au moment de la compilation. Le compilateur ne peut pas déterminer le résultat de cette expression.
Peut-être vous pouvez essayer
VALUE1
est statique. Vous pourriez avoir votre propremyValueOf()
et il fonctionne encore.Merde,
valueOf()
n'est pas dans uncase
à tous. Je suis à la suppression de ce commentaire précédent, ne peut pas la regarder. Merci encore.Soyez prudent avec valueOf() qui jettent des NPE et IllegalArgumentException si l'argument n'est pas valide. Type de code à faire sens pour éviter de traiter ces exception (mais malheureusement ne fonctionne pas).
OriginalL'auteur Peter Lawrey
Non, pas forcément: vous êtes libre de fournir votre propre mise en œuvre de
toString()
}
En outre, quelqu'un qui est le maintien de votre code pourrait ajouter à cette mise en œuvre après votre départ de l'entreprise. C'est pourquoi vous ne devriez pas compter sur les valeurs de Chaîne, et le bâton à l'aide de valeurs numériques (représentés par les constantes
MyEnum.VALUE1
,MyEnum.VALUE2
, etc.) de votreenum
s à la place.Bien sûr, je suis absolument d'utiliser des noms de constantes, de ne pas les littéraux entiers qui correspondent à ces noms! Merci, j'ai édité la réponse à tenir compte de cet important point.
Oh, à droite. C'est une bonne explication, merci.
OriginalL'auteur dasblinkenlight
À ajouter à la Pierre Lawrey commentaires, regardez cette post de l'an dernier qui traite de la Commutation sur la Chaîne de caractères en Java avant et après le JDK7.
Eh bien, un puriste pourrait dire que vous ne devriez pas utiliser un switch/case énoncé dans un langage de programmation orientée objet; au lieu de cela, vous devriez aller avec un polymorphisme de la stratégie pour traiter avec quelque chose comme ça. OMI, s'il est clair, concis, facile à maintenir, et efficace, un cas ou l'interrupteur est la meilleure solution dans de nombreux scénarios.
OriginalL'auteur Sanjeev
MODIFIER: mes Excuses pour C# répondre à un Java question. Je ne sais pas ce qui s'est passé là.
Il est possible d'utiliser des valeurs de chaîne (y compris les valeurs de chaîne d'énumérations). Cependant, vous ne pouvez utiliser des constantes de compilation. Vous êtes à l'appel d'une méthode,
ToString()
, qui doit être évaluée au moment de l'exécution.De C# 6, vous pouvez utiliser cette constante alternative:
case nameof(SomeEnum.SomeValue):
Nameof() est évalué au moment de la compilation, il suffit d'une chaîne de caractères qui correspond à la (non qualifié) nom de la variable donnée, le type, ou d'un membre. Sa valeur correspond à celle de
SomeEnum.ToString()
.OriginalL'auteur Timo