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, aparece un constant expression required
error en cada una de las 3 etiquetas de caso.
Entiendo que el compilador necesita que la expresión se conozca en el momento de la compilación para compilar un interruptor, pero ¿por qué no es Foo.BA_
constante?
java
compile-time-constant
Austin Hyde
fuente
fuente
public static final int
s están dispersos por todo el JDK, así que eso fue lo que hice.Respuestas:
Si bien son constantes desde la perspectiva de cualquier código que se ejecute después de que se hayan inicializado los campos, no son una constante de tiempo de compilación en el sentido requerido por JLS; vea §15.28 Expresiones constantes para la especificación de una expresión constante 1 . Esto se refiere a §4.12.4 Variables finales que define una "variable constante" de la siguiente manera:
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 otros ejemplos (donde los inicializadores ya son expresiones constantes en tiempo de compilación), declarar la variable como
final
puede ser lo que se necesita.Puede cambiar su código para usar una en
enum
lugar deint
constantes, pero eso trae otro par de restricciones diferentes:default
caso, incluso si usted tienecase
para cada valor conocido de laenum
; consulte ¿Por qué se requiere el valor predeterminado para un cambio en una enumeración?case
Todas las etiquetas deben ser explícitosenum
los valores, no expresiones que se evalúan comoenum
valores.1 - Las restricciones de expresión constante se pueden resumir de la siguiente manera. Las expresiones constantes a) pueden usar tipos primitivos y
String
solo, b) permitir primarios que sean literales (aparte denull
) y solo variables constantes, c) permitir expresiones constantes posiblemente entre paréntesis como subexpresiones, d) permitir operadores excepto operadores de asignación++
,--
oinstanceof
, y e) permitir conversiones de tipos a tipos primitivos oString
solo.Tenga en cuenta que esto no incluye ningún tipo de método o lambda llamadas,
new
,.class
..length
o suscripciones de matriz. Además, cualquier uso de valores de matriz,enum
valores, valores de tipos de envoltorio primitivo, boxeo y unboxing están excluidos debido a a).fuente
Obtiene la expresión Constante requerida porque dejó los valores fuera de sus constantes. Tratar:
fuente
Recibí este error en Android, y mi solución fue solo usar:
en vez de
fuente
Porque esas no son constantes de tiempo de compilación. Considere el siguiente código válido:
Solo puede conocer el valor de
BAR
en tiempo de ejecución.fuente
public static final int BAR = new Random().nextInt()
?new Random().nextInt()
devolver los mismos valores?Puede usar una enumeración como en este ejemplo:
Fuente: declaración de cambio con enumeración
fuente
enum Codes { CODE_A(1), CODE_B(2); private mCode; Codes(int i) { mCode = i; } public int code() { return mCode; } }
<br/> Cuando trato de usar la enumeración en el conmutador obtengo el mismo error ... <br/>switch(field) { case Codes.CODE_A.code() : // do stuffs.. ; }
<br/> ¿Es posible resolver el problema?Esto fue respondido hace años y probablemente no sea relevante, pero por si acaso. Cuando me enfrenté a este problema, simplemente usé una
if
declaración en lugar deswitch
, resolvió el error. Por supuesto, es una solución alternativa y probablemente no sea la solución "correcta", pero en mi caso fue suficiente.fuente
switch
generalmente es más rápido que muchoif-else
, porqueswitch
solo verifica la condición una vez , mientras queif-else
es posible que necesites verificar todas las condiciones antes de encontrar la correcta.A veces el variable interruptor también puede cometer ese error, por ejemplo:
Para resolver, debe convertir la variable a int (en este caso). Entonces:
fuente
Recibí este error en Android al hacer algo como esto:
a pesar de declarar una constante:
public static final String ADMIN_CONSTANT= "Admin";
Resolví el problema cambiando mi código a esto:
fuente
En mi caso, recibí esta excepción porque
en el segundo caso, estaba llamando a la constante desde la instancia,
var.MODIFICAR_KM:
pero debería usarlaVariablesKmDialog.OBTENER_KM
directamente desde la clase.fuente
Si lo está utilizando en una caja de interruptor, entonces necesita obtener el tipo de la enumeración incluso antes de enchufar ese valor en el interruptor. Por ejemplo :
Y la enumeración es como:
fuente
El siguiente código se explica por sí mismo. Podemos usar una enumeración con una caja de interruptor:
En función de los valores de clase de la enumeración se pueden asignar:
Espero eso ayude :)
fuente
Recomiendo usar la siguiente manera:
fuente
private Animal(String name) { this.name = name; }
Te recomiendo que uses enumeraciones :)
Mira esto:
Entonces puedes usarlo así:
fuente