Maison >Java >javaDidacticiel >Pourquoi mon instruction Java Switch renvoie-t-elle une erreur « Expression constante requise » lors de l'utilisation de constantes statiques ?

Pourquoi mon instruction Java Switch renvoie-t-elle une erreur « Expression constante requise » lors de l'utilisation de constantes statiques ?

DDD
DDDoriginal
2024-12-08 17:59:12617parcourir

Why Does My Java Switch Statement Throw a

Instruction Java switch : erreur inattendue d'expression constante lors de l'utilisation de constantes statiques

Lorsque vous travaillez avec des instructions Java switch, il est important de vous assurer que les expressions utilisées dans les étiquettes de cas sont des expressions constantes. Les expressions constantes sont des expressions évaluées au moment de la compilation et produisent une valeur constante. Ceci est nécessaire car le compilateur a besoin de connaître la valeur exacte de l'expression afin de déterminer quel cas exécuter.

Dans l'exemple suivant, nous avons une classe avec trois constantes statiques :

public abstract class Foo {
    ...
    public static final int BAR;
    public static final int BAZ;
    public static final int BAM;
    ...
}

Nous avons alors une méthode qui utilise une instruction switch pour obtenir une chaîne pertinente basée sur la constante :

public static String lookup(int constant) {
    switch (constant) {
        case Foo.BAR: return "bar";
        case Foo.BAZ: return "baz";
        case Foo.BAM: return "bam";
        default: return "unknown";
    }
}

Cependant, lorsque nous essayons de compiler ce code, nous obtenons un expression constante requise erreur sur chacune des trois étiquettes de cas. En effet, même si les constantes sont constantes du point de vue de tout code qui s'exécute après l'initialisation des champs, elles ne sont pas des constantes de temps de compilation au sens requis par la spécification du langage Java (JLS).

Plus précisément , le JLS définit une expression constante comme une expression qui peut être évaluée au moment de la compilation pour produire une valeur constante. Cela signifie que l'expression ne peut contenir aucune variable qui n'est pas elle-même constante, ni aucune opération qui n'est pas elle-même constante.

Dans notre exemple, les constantes Foo.BA* ne sont pas des constantes de temps de compilation car elles n'ont pas initialiseurs. Pour résoudre ce problème, nous pouvons simplement initialiser les constantes avec des expressions constantes de temps de compilation :

public abstract class Foo {
    ...
    public static final int BAR = 1;
    public static final int BAZ = 2;
    public static final int BAM = 3;
    ...
}

Maintenant, lorsque nous compilons le code, il devrait être compilé avec succès.

Il est également important de noter que les énumérations peuvent être utilisées à la place des constantes int dans une instruction switch. Cependant, les énumérations ont certaines restrictions que les constantes int n'ont pas. Par exemple, les énumérations doivent avoir une casse par défaut, même si vous avez une casse pour chaque valeur connue de l'énumération. De plus, les étiquettes de cas doivent toutes être des valeurs d'énumération explicites, et non des expressions qui s'évaluent en valeurs d'énumération.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn