#define en Java
#define java (7)
Estoy empezando a programar 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.
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 compilan 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 compilar 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 recompilar 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 compilador 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 compilará en el código de bytes. Pero si cambió DEBUG
a true
entonces sería.
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 fuentes para diferentes casos y para no duplicar el código.
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 compiladores (si el valor es una constante en tiempo de compilació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 compilador los inscribe). Si cambia el valor, deberá recompilar todas las fuentes que hicieron referencia a ese campo constante.
La respuesta más simple es "No hay un método directo para obtenerla porque no hay precompilador". 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 programa
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 pila .
No, porque no hay precompilador.
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 compilador 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.
static final int PROTEINS = 1
...
myArray[PROTEINS]
Normalmente pondrías "constantes" en la clase misma. Y tenga en cuenta que un compilador 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 compilador puede haber escrito "4" en el último ciclo de compilación.