texto definicion colorear color cambiar java compile-time-constant

definicion - Declaración de cambio de Java: se requiere expresión constante, pero ES constante



jlabel definicion (8)

Entonces, estoy trabajando en esta clase que tiene algunas constantes estáticas:

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

Entonces, me gustaría una forma de obtener una cadena relevante basada en 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"; } }

Sin embargo, cuando compilo, obtengo un error de constant expression required en cada una de las 3 etiquetas de casos.

Entiendo que el compilador necesita que se conozca la expresión en tiempo de compilación para compilar un Foo.BA_ , pero ¿por qué no es constante Foo.BA_ ?


Entiendo que el compilador necesita que se conozca la expresión en tiempo de compilación para compilar un modificador, pero ¿por qué no es constante Foo.BA_?

Si bien son constantes desde la perspectiva de cualquier código que se ejecute después de que los campos se hayan inicializado, no son una constante de tiempo de compilación en el sentido requerido por el JLS; ver §15.28 Expresiones constantes para una definición de lo que se requiere de una expresión constante. Esto se refiere a §4.12.4 Variables finales que define una "variable constante" de la siguiente manera:

Llamamos a una variable, de tipo primitivo o tipo String, que es definitiva e inicializada con una expresión constante en tiempo de compilación (§15.28) una variable constante. Que una variable sea o no una variable constante puede tener implicaciones con respecto a la inicialización de clase (§12.4.1), la compatibilidad binaria (§13.1, §13.4.9) y la asignación definida (§16).

En su ejemplo, las variables Foo.BA * no tienen inicializadores y, por lo tanto, no califican como "variables constantes". La solución es simple; cambie las declaraciones de variables Foo.BA * para tener inicializadores que sean expresiones constantes en tiempo de compilación.


En ocasiones, la variable de cambio también puede generar ese error, por ejemplo:

switch(view.getTag()) {//which is an Object type case 0://will give compiler error that says Constant expression required //... }

Para resolverlo debes convertir la variable a int (en este caso). Asi que:

switch((int)view.getTag()) {//will be int case 0: //No Error //... }


Esto fue respondido hace años y probablemente no sea relevante, pero por las dudas. Cuando me enfrenté a este problema, simplemente utilicé una declaración if vez de un switch , resolvió el error


Obtiene expresión constante requerida porque dejó los valores fuera de sus constantes. Tratar:

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


Porque esas no son constantes de tiempo de compilación. Considere el siguiente código válido:

public static final int BAR = new Random().nextInt();

Solo puedes conocer el valor de BAR en tiempo de ejecución.


Puedes usar una enumeración como en este ejemplo:

public class MainClass { enum Choice { Choice1, Choice2, Choice3 } public static void main(String[] args) { Choice ch = Choice.Choice1; switch(ch) { case Choice1: System.out.println("Choice1 selected"); break; case Choice2: System.out.println("Choice2 selected"); break; case Choice3: System.out.println("Choice3 selected"); break; } } }

Fuente: cambio de declaración con enum


Recibí este error en Android, y mi solución fue solo usar:

public static final int TAKE_PICTURE = 1;

en lugar de

public static int TAKE_PICTURE = 1;


Te recomiendo que uses enums :)

Mira esto:

public enum Foo { BAR("bar"), BAZ("baz"), BAM("bam"); private final String description; private Foo(String description) { this.description = description; } public String getDescription() { return description; } }

Entonces puedes usarlo así:

System.out.println(Foo.BAR.getDescription());