#define en Java

Estoy empezando a progtwigr en Java y me pregunto si existe el equivalente a C ++ #define .

Una búsqueda rápida de Google dice que no, pero ¿alguien podría decirme si existe algo similar en Java? Estoy tratando de hacer que mi código sea más legible.

En lugar de myArray[0] , quiero poder escribir myArray[PROTEINS] por ejemplo.

No, porque no hay precomstackdor.

Sin embargo, Hotspot es increíblemente bueno para optimizar cuando sea posible, por lo que en su caso podría lograr lo mismo de la siguiente manera:

 class MyClass { private static final int PROTEINS = 0; ... MyArray[] foo = new MyArray[PROTEINS]; } 

El comstackdor se dará cuenta de que PROTEINS nunca puede cambiar y por lo tanto lo alineará, que es más o menos lo que quiere.

Tenga en cuenta que el modificador de acceso en la constante no es importante aquí, por lo que podría ser public o protected lugar de privado, si desea reutilizar la misma constante en múltiples clases.

El espacio de comentarios es demasiado pequeño, así que aquí hay más información para usted sobre el uso de la static final . Como dije en mi comentario a la respuesta de Andrzej , solo los primitivos y String se comstackn directamente en el código como literales. Para demostrar esto, intente lo siguiente:

Puede ver esto en acción creando tres clases (en archivos separados):

 public class DisplayValue { private String value; public DisplayValue(String value) { this.value = value; } public String toString() { return value; } } public class Constants { public static final int INT_VALUE = 0; public static final DisplayValue VALUE = new DisplayValue("A"); } public class Test { public static void main(String[] args) { System.out.println("Int = " + Constants.INT_VALUE); System.out.println("Value = " + Constants.VALUE); } } 

Compile esto y ejecute Test, que imprime:

 Int = 0 Value = A 

Ahora, cambie Constants para tener un valor diferente para cada uno y solo compile Constants clase. Cuando ejecuta Test nuevamente (sin volver a comstackr el archivo de clase) todavía imprime el valor anterior para INT_VALUE pero no VALUE . Por ejemplo:

 public class Constants { public static final int INT_VALUE = 2; public static final DisplayValue VALUE = new DisplayValue("X"); } 

Ejecute la prueba sin recomstackr Test.java :

 Int = 0 Value = X 

Tenga en cuenta que cualquier otro tipo utilizado con static final se mantiene como referencia.

Similar a C / C ++ #if / #endif , un literal constante o uno definido a través de static final con primitivas, utilizado en una condición Java if regular y se evalúa como false hará que el comstackdor elimine el código de bytes de las instrucciones dentro del bloque if (no serán generados).

 private static final boolean DEBUG = false; if (DEBUG) { ...code here... } 

El código en “… código aquí …” no se comstackrá en el código de bytes. Pero si cambió DEBUG a true entonces sería.

 static final int PROTEINS = 1 ... myArray[PROTEINS] 

Normalmente pondrías “constantes” en la clase misma. Y tenga en cuenta que un comstackdor puede optimizar las referencias a él, así que no lo cambie a menos que recompile todas las clases que lo usan.

 class Foo { public static final int SIZE = 5; public static int[] arr = new int[SIZE]; } class Bar { int last = arr[Foo.SIZE - 1]; } 

Editar ciclo … SIZE=4 . También compile Bar porque su comstackdor puede haber escrito “4” en el último ciclo de comstackción.

Java no tiene una directiva de preprocesador de define propósito general.

En el caso de las constantes, se recomienda declararlas como static finals , como en

 private static final int PROTEINS = 100; 

Tales declaraciones estarían indicadas por los comstackdores (si el valor es una constante en tiempo de comstackción).

Tenga en cuenta también que los campos constantes finales estáticos públicos son parte de la interfaz pública y sus valores no deben cambiar (a medida que el comstackdor los inscribe). Si cambia el valor, deberá recomstackr todas las fonts que hicieron referencia a ese campo constante.

Existe un preprocesador para Java que proporciona directivas como #define, #ifdef, #ifndef y muchas otras, por ejemplo, el equipo de PostgresJDBC lo usa para generar fonts para diferentes casos y para no duplicar el código.

La respuesta más simple es “No hay un método directo para obtenerla porque no hay precomstackdor”. Pero puede hacerlo usted mismo. Use las clases y luego defina las variables como definitivas para que pueda suponerse como constante a lo largo del progtwig
No te olvides de utilizar final y variable como público o protegido no privado, de lo contrario no podrás acceder desde fuera de esa clase

La solución más legible es usar Static Import . Entonces no necesitarás usar AnotherClass.constant .

Escribe una clase con la constante como campo public static .

 package ConstantPackage; public class Constant { public static int PROTEINS = 1; } 

Luego solo usa Static Import donde necesites la constante.

 import static ConstantPackage.Constant.PROTEINS; public class StaticImportDemo { public static void main(String[]args) { int[] myArray = new int[5]; myArray[PROTEINS] = 0; } } 

Para saber más acerca de la importación estática, consulte esta pregunta sobre desbordamiento de stack .