Pregunta

Sucede que venir a través de un código de Java en mi lugar de trabajo. Este es el escenario:. Hay 2 clases - ClassA y ClassB

ClassA tiene nada más que 4 valores de cadena public static final en su interior. Su propósito es utilizar esos valores como ClassA.variable (no me pregunte por qué, no es mi código).

importaciones ClassB ClassA. He editado los valores de cadena en ClassA y compilé. Cuando me encontré con ClassB pude ver que estaba usando los viejos valores - no los nuevos valores. Tenía que volver a compilar ClassB a hacer que use nuevos valores de ClassA! (Tuve que volver a compilar otras clases que las importaciones ClassA!)

¿Es sólo a causa de JDK 1.6 o debería haber sabido antes de volver a compilar ClassB también! Iluminame. :)

¿Fue útil?

Solución

Si los valores de las variables de final ClassA clase resultan ser constantes en tiempo de compilación, el compilador podría haber ellos inline en las clases utilizando ClassA en lugar de generar una referencia de tiempo de ejecución. Creo que, esto es lo que ocurrió en el caso que usted describe.

Ejemplo:

public class Flags {
    public static final int FOO = 1;
    public static final int BAR = 2;
}

public class Consumer {
    public static void main(String[] args) {
         System.out.println(Flags.FOO);
    }
}

En este ejemplo, el compilador probable incorporará el valor de FOO en el código generado para Consumer en lugar de generar la referencia de tiempo de ejecución equivalente. Si el valor de los cambios FOO más adelante, tendrá que volver a compilar Consumer con el fin de tenerlo utilizar el nuevo valor.

Esta es una optimización, que tiene algunas ventajas con respecto a la eficiencia y la velocidad del programa compilado. Por ejemplo, el valor inline podría permitir optimizaciones adicionales en las expresiones, que lo utilizan, por ejemplo:

int x = Flags.FOO * 10;

En este ejemplo, el valor inline (en este caso: 1). Permite al compilador que notar, que la multiplicación no hace ninguna diferencia, y puede ser omitida alltogether

Otros consejos

Es un problema de compatibilidad binaria. Las referencias a campos constantes se resuelven en tiempo de compilación. El comportamiento que está viendo es correcta; si cambia los valores en la clase A continuación, tendrá que volver a compilar el cliente (clase B). Para evitar tales problemas considerar la adición de constantes utilizando un tipo de enumeración, introducido en Java liberan 5,0.

¿Por qué estás tratando de compilar las clases de forma individual?

Utilice un sistema de construcción como experto o una hormiga o simplemente dejar hacer su IDE él.

La única cosa segura a hacer es volver a compilar todos los java que depende de una clase java que ha cambiado hasta que cada clase que podría tener lugar ha sido re-compilado.

Si no está utilizando los valores de un interruptor que puede hacer esto en su lugar:

public class A
{
    public static final int FOO;
    public static final String BAR;

    static
    {
        FOO = 42;
        BAR = "Hello, World!";
    }
}

A continuación, el compilador ya no codificar los valores de las otras clases que se utilizan.

Supongamos claseA se ve así:

public class ClassA {
    public static final int FOO = 1;
    public static final int BAR = 2;
}

Si vuelve a compilar ella, ClassB continuará utilizando los valores antiguos. Supongo que podría depender del compilador, pero creo que este es el comportamiento típico. Si no desea volver a compilar ClassB cada una constante en los cambios ClassA, que tendrá que hacer algo como esto:

public class ClassA {
    public static final int FOO = CONST(1);
    public static final int BAR = CONST(2);

    public static int CONST(int i) { return i; }
}

Becuase ahora javac no está dispuesto a inline las constantes. En su lugar, llamará al método CONST (int) cuando inicializador estático de claseA funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top