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 requirederror 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 ints 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
finalpuede ser lo que se necesita.Puede cambiar su código para usar una en
enumlugar deintconstantes, pero eso trae otro par de restricciones diferentes:defaultcaso, incluso si usted tienecasepara cada valor conocido de laenum; consulte ¿Por qué se requiere el valor predeterminado para un cambio en una enumeración?caseTodas las etiquetas deben ser explícitosenumlos valores, no expresiones que se evalúan comoenumvalores.1 - Las restricciones de expresión constante se pueden resumir de la siguiente manera. Las expresiones constantes a) pueden usar tipos primitivos y
Stringsolo, 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 oStringsolo.Tenga en cuenta que esto no incluye ningún tipo de método o lambda llamadas,
new,.class..lengtho suscripciones de matriz. Además, cualquier uso de valores de matriz,enumvalores, 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
BARen 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
ifdeclaració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
switchgeneralmente es más rápido que muchoif-else, porqueswitchsolo verifica la condición una vez , mientras queif-elsees 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_KMdirectamente 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