2010-07-02 14 views
5

Digamos que tengo una aplicación Java que utiliza un (estática) int constante de una biblioteca:almacenamiento en caché local de Java constantes de

int myVal = OutsideLibraryClass.CONSTANT_INT;

Ahora, sin recompilar mi aplicación, la ejecuto contra una versión ligeramente diferente de OutsideLibraryClass, en la que el valor de CONSTANT_INT es diferente.

¿Mi aplicación va a ver el nuevo valor (porque lo recoge en tiempo de ejecución) o el anterior (porque el valor está compilado en el bytecode en mi método)? ¿Hay alguna diferencia si CONSTANT_INT es final? ¿Hay alguna parte de las especificaciones de Java que hable de esto?

+0

Ver también: http://stackoverflow.com/questions/1693091/public-static-final-variable-in -an-imported-java-class/1693135 # 1693135 – Dirk

Respuesta

4

Las referencias a los campos constantes se resuelven en tiempo de compilación a los valores constantes que denotan. (JLS 13.1)

+0

Huh, nunca hubiera esperado esto. ¡Gracias por la información! – Pace

+1

Esto es casi lo mismo que un rompecabezas complicado 93 en un libro Puzzlers de Java: trampas, trampas y casos de esquinas – Nulldevice

1

No, no recuperará el nuevo valor. Esto es parte de la especificación del idioma. Ver this question.

+0

Depende del modificador final para CONSTANT_INT. – Nulldevice

+1

@Nulldevice, si el campo se llama constante, eso implica directamente un modificador final, IMO. ¿Y qué tipo de biblioteca tendría una int pública no final de todos modos? – Yishai

1

De la especificación JVM:

Una variable de clase es un campo de un tipo de clase declara usando la palabra clave estática (§2.9.1) dentro de una declaración de la clase, o con o sin la palabra clave estática en una declaración de interfaz. Las variables de clase se crean cuando se carga la clase o la interfaz (§2.17.2) y se inicializan en la creación a valores por defecto (§2.5.1). La variable de clase efectivamente deja de existir cuando su clase o interfaz está descargada (§2.17.8).

Así que cuando el ClassLoader carga el OutsideLibraryClass, el valor se inicializa. Cuando realiza su declaración de asignación en myVal, el valor se carga en tiempo de ejecución en función del archivo de clase OutsideLibraryClass que cargó el ClassLoader. Entonces, si apaga la JVM, cambia el archivo jar que contiene OutsideLibraryClass y lo vuelve a ejecutar, obtendrá el valor de la nueva clase.

ACTUALIZACIÓN

La declaración anterior es cierto si usted está hablando de una instancia una variable local dentro de un método. Si su variable myVal se declara en el nivel de clase, las personas que dicen que no cambiará son correctas.

+0

Dije 'estático'. Y lo mencionó como estático. – DJClayworth

+0

Debería haber escogido mis palabras con más cuidado. Me refería a que 'myVal' era una variable local dentro de un método; Entendí que querías decir que CONSTANT_INT era estático final. Si toma su declaración exacta y la mueve a una variable de instancia de nivel de clase, no obtendrá el nuevo valor cuando intercambie jarras. Si toma la misma declaración y la coloca dentro de un método (no estático), recuperará el nuevo valor cuando intercambie los archivos jar. – proflux

+0

¿Has probado esto? Puzzle 93 de Java Puzzlers parece decir que el valor se fija en tiempo de compilación si myval es una variable local o de instancia. – DJClayworth

2

Lamentablemente su pregunta no es lo suficientemente específica como para responder a la pregunta, porque puede o no puede cambiar sin volver a compilar. Aquí hay un ejemplo donde el valor constante cambiará sin recompilar.

public class Const { 
    public static final int CONSTANT; 
    static { 
     CONSTANT = 4; 
    } 
} 

class Test 
{ 
    int c = Const.CONSTANT; 
} 

Y aquí hay un caso en el que no se cambio sin recompilar

public class Const { 
    public static final int CONSTANT = 4; 
} 

class Test 
{ 
    int c = Const.CONSTANT; 
} 
+0

Aunque este no era el problema por el que estaba preguntando, merece +1 por recordarnos que una constante debe ser detectable como una constante por el compilador. – DJClayworth

Cuestiones relacionadas