2012-08-02 10 views
12

Esto es de Effective Java¿Qué significa decir que los patrones int enum son constantes de tiempo de compilación?

Los programas que utilizan el patrón de enumeración int son frágiles. Como las enumeraciones son constantes de tiempo de compilación, se compilan en los clientes que las utilizan.

Puede alguien explicar por qué el patrón int enumeración se llama tipo compilado constante y lo que se entiende por compilado en los clientes?

Aquí s'un ejemplo de una constante tal:

public static final int APPLE_FUJI = 0; 
+0

Es una de las pocas optimizaciones que hace 'javac' y, en general, preferiría que no;) –

Respuesta

17

Suponga que tiene dos archivos:

Foo.java: 
public class Foo 
{ 
    public static final int SOMETHING = 1; 
} 

Bar.java: 
public class Bar 
{ 
    public static void main(String[] args) 
    { 
     System.out.println(Foo.SOMETHING); 
    } 
} 

los dos compilar, ejecutar java Bar y se imprimirá 1.

Ahora cambiar Foo.java modo que SOMETHING es 2, y recompilar simplemente Foo .java. Vuelva a ejecutar java Bar y todavía print 1. El valor constante se copiará en cada fragmento de código que lo use, en lugar de solicitar el valor de Foo en el momento de la ejecución.

En la práctica, si recompila todo en cualquier momento que algo cambie, esto no es un problema.

+0

¿no es Java un lenguaje de enlace dinámico? ¿Por qué tenemos que recompilar todo? – Geek

+2

@Geek No tienes ** para hacerlo. Pero es muy recomendable para evitar lo que Jon Skeet está describiendo arriba. Este comportamiento del compilador de Java es malo, en mi opinión. Esa constante solo debe almacenarse en 'Foo.class'. 'Bar' SIEMPRE debería obtener esa constante de' Foo'. Como muchas otras cosas semi-estúpidas en un idioma: no se cambiará porque tal vez se rompa el código existente. Qué montón de cry-babies ... –

+0

@Geek: Tendría que definir "lenguaje de enlace dinámico" para que responda su primera pregunta. Pero la razón por la que tiene que volver a compilar en este caso es porque la especificación del lenguaje explícitamente llama expresiones constantes como esta. –

5

El valor '0' en sí se construirá en los archivos .class durante la compilación. Si luego cambia ese valor, debe recompilar todo que lo use, incluido el código de cualquier cliente que use su aplicación/biblioteca.

Si no lo hace, no recibirá una advertencia, sino un comportamiento incorrecto.

Si su constante de tiempo de compilación se utiliza únicamente en su código, entonces no es un problema, suponiendo un ciclo completo de limpieza/compilación. Si su código llega a un público más amplio, entonces esto se convierte en un problema mayor.

Cuestiones relacionadas