Pourquoi dois-je obtenir un Enum référence constante ne peut pas être qualifié dans une affaire d'étiquette?
Pourquoi le code suivant ne parviennent pas à compiler, tandis que l'évolution de l'instruction de cas de
case ENUM1: doSomeStuff();
fonctionne?
public enum EnumType
{
ENUM1, ENUM2, ENUM3;
void doSomeStuff()
{
switch(this)
{
case EnumType.ENUM1: doSomeStuff();
}
}
}
- Serait "java a des défauts et n'a pas vraiment d'essayer de comprendre ce un" être une réponse raisonnable? je veux dire, les réponses ici sont grands et détaillés, mais dans ce cas je pense qu'ils il n'a pas vraiment d'importance. +1 question, -1 JAVA...
- a l'explication correcte de votre cas. Pour voir un peu dans le détail de la solution à ce qualificatif question sur les énumérations (avec exemple), merci de voir ce post
Vous devez vous connecter pour publier un commentaire.
C'est pour éviter la possibilité de comparer les différents types d'énumérations. Il est logique de le restreindre à un type, c'est à dire le type de la valeur d'enum dans leswitch
déclaration.Mise à jour: c'est en fait pour garder la compatibilité binaire. Voici un cite d'environ à mi-chemin chapitre 13.4.9 de JLS:
En d'autres termes, en raison de l'identificateur de classe dans
EnumType.ENUM1
, il ne peut pas être représenté comme une compile-time expression constante, alors qu'il est requis par laswitch
déclaration.OtherEnumType.ENUM1
l' (Eclipse) compilateur donneType mismatch: cannot convert from OtherEnumType to EnumType
, tandis que pourEnumType.ENUM1
il donneThe qualified case label EnumType.ENUM1 must be replaced with the unqualified enum constant ENUM1
. Donc pour moi, il semble que l'interdiction du type de qualificatif n'est pas liée à la détection d'incompatibilité de type.Ce n'est pas vraiment répondre à votre question, mais si vous avez le code en fonction de la valeur d'enum, vous pouvez également créer une méthode abstraite dans votre enum qui est surchargé pour chaque valeur:
Puisque vous êtes de commutation sur un objet de type
EnumType
et les seules valeurs possibles sont les enum constantes, il n'y a pas besoin de qualifier ces constantes de nouveau à l'intérieur de l'interrupteur. Après tout, il serait illégal d'avoircase OtherEnumType.ENUM1:
en elle de toute façon.case
branches doivent être qualifiés, de sorte que vous aurez besoin d'utiliser un statique à l'importation de réaliser que la situation dans la définition de votre classe, si vous n'êtes pas de l'écriture de l'enum.