[JAVA] N'y a-t-il pas un conflit de nom lorsque enum a le même nom dans l'instruction switch?

introduction

Dans l'instruction de commutation Java, lorsque enum est utilisé comme expression, aucun nom qualifié n'est donné. C'était étrange que la compilation réussisse quand il y avait deux ou plusieurs constantes identiques, alors je l'ai vérifiée. Tout d'abord, vous n'avez pas besoin de le modifier, vous pouvez donc l'utiliser tel quel sans vous en soucier.

Quand il y a une énumération

Supposons que vous ayez une énumération comme celle-ci.

FoodType.java


public enum FoodType {
    RICE,
    BREAD,
    OTHER,
}

Main.java


import lombok.AllArgsConstructor;

public class Main {
    public static void main(String[] args) {
        Food food = new Food(FoodType.RICE);
        switch (food.foodType){
        case RICE:
            System.out.println("Souder");
            break;
        case BREAD:
            System.out.println("C'est du pain");
            break;

        default:
            System.out.println("Autre");
            break;
        }
    }
}

@AllArgsConstructor
class Food {
    FoodType foodType;
}

Du côté principal, enum (FoodType) est ramifié par l'instruction switch. Dans ce cas, écrivez le cas comme «RICE» au lieu de «FoodType.RICE». (Pourquoi RICE est bon sera expliqué plus tard.)

Quand il y a deux énumérations

Ajoutons une énumération au code ci-dessus. Supposons que vous souhaitiez subdiviser la catégorie du riz.

RiceType


public enum RiceType {
    RICE,
    FriedRice,
}

Main a également changé.

Main.java


import lombok.AllArgsConstructor;

public class Main {
    public static void main(String[] args) {
        Food food = new Food(FoodType.RICE,RiceType.RICE);
        switch (food.foodType){
            case RICE:
                switch (food.riceType){
                    case RICE:
                        System.out.println("Souder");
                        break;
                    case FriedRice:
                        System.out.println("C'est du riz frit");
                        break;
                }
                break;
            case BREAD:
                System.out.println("C'est du pain");
                break;

            default:
                System.out.println("Autre");
                break;
        }
    }
}
@AllArgsConstructor
class Food {
    FoodType foodType;
    RiceType riceType;
}

Pourquoi les noms ne sont pas en conflit

Le code ci-dessus se compilera. C'est le code correct, mais je me demandais si case RICE: et case RICE: compileraient sans conflit dans les parties suivantes de Main: De plus, l'importation n'est pas utilisée car tout le code est inclus.

      switch (food.foodType){
            case RICE:
                switch (food.riceType){
                    case RICE: 

Qualifié au moment de la compilation

Après examen, les noms de classe sont maintenant qualifiés au moment de la compilation, donc les noms ne semblent pas entrer en conflit. Bien qu'il soit un peu ancien, le résultat de la compilation inverse d'énumération est présenté dans la section "Implémentation du commutateur" du site suivant. http://www.ne.jp/asahi/hishidama/home/tech/java/enum.html#h2_switch

Résumé

C'était un mécanisme qualifié au moment de la compilation.

Recommended Posts

N'y a-t-il pas un conflit de nom lorsque enum a le même nom dans l'instruction switch?
Java learning_Behavior lorsqu'il y a un champ avec le même nom et une méthode avec le même nom dans deux classes dans une relation d'héritage
Comment référencer une colonne lors du remplacement de la méthode de nom de colonne dans ActiveRecord
[Java] Lors de la mise d'une chaîne de caractères dans le cas de l'instruction switch, il est nécessaire d'en faire une expression constante
[Tutoriel Rails Chapitre 2] Que faire lorsque vous faites une erreur dans le nom de la colonne
gestion des erreurs wsimport (une classe / interface avec le même nom "xxx" est déjà utilisée)
[Head panic] Priorité lorsque des variables / méthodes portant le même nom sont utilisées dans des classes héritées
Comment ajouter les mêmes index dans un tableau imbriqué
J'étais confus parce qu'il y avait une scission dans le tableau