2010-12-15 8 views
29

bien, así que decir que tengo una clase que tiene este aspecto:Java: ¿en qué orden se inicializan los campos finales estáticos?

public class SignupServlet extends HttpServlet { 
    private static final Logger SERVLET_LOGGER=COMPANYLog.open(SignupServlet.class); 
    private static final ExceptionMessageHandler handler = new ExceptionMessageHandler(); 
    private static final SignupServletObservableAgent signupObservableAgent = 
     new SignupServletObservableAgent(null, SERVLET_LOGGER); 
} 

¿Puedo contar con el cargador de clases para inicializar los campos con el fin, de modo que puedo confiar en SERVLET_LOGGER deberían ejecutarse antes signupObservableAgent?

Respuesta

44

Sí, se inicializan en el orden en que aparecen en la fuente. Puede leer todos los detalles sangrientos en The Java Language Specification, §12.4.2. Vea el paso 9, que dice:

... ejecute los inicializadores de variable de clase y los inicializadores estáticos de la clase, o los inicializadores de campo de la interfaz, en orden textual, como si fueran un solo bloque, excepto que las variables de clase final y los campos de interfaces cuyos valores son constantes de tiempo de compilación se inicializan primero ...

+0

Impresionante - gracias! – sangfroid

3

Creo que la inicialización de campos estáticos podría reordenarse. Al menos es decir cómo entiendo JMM specification

Hay una serie de casos en los que accede a las variables (campos de instancia de objeto, los campos estáticos de clase, y elementos de la matriz) programa puede parecer para ejecutar en un orden diferente que se ha especificado por el programa.

+3

Esta parte también establece "... y el valor de b no * depende * del valor de a, entonces el compilador puede reordenar estas operaciones, ..." –

+0

La cita es sobre accesos, no inicializaciones. – EJP

1

si la clase secundaria y la clase superior está allí.

  1. EX: 'A': superclase 'B': subclase y se extiende super clase 'A'
  2. cuando la clase B a cargar y Una clase también carga
  3. todas las variables estáticas saber la memoria con el valor predeterminado de 'A' y 'B' clase
  4. los miembros estáticos (variable estática, bloque estático) se ejecutan en orden de arriba a abajo de la clase 'A' y luego de la clase 'B' para que declaren. finalmente el método principal se ejecuta desde la clase secundaria automáticamente.
-1

Este es un lugar donde puede usar un bloque estático que garantizaría la secuencia de ejecución.

public class SignupServlet extends HttpServlet { 
    private static final Logger SERVLET_LOGGER; 
    private static final ExceptionMessageHandler handler; 
    private static final SignupServletObservableAgent signupObservableAgent; 

    static { 
     SERVLET_LOGGER = COMPANYLog.open(SignupServlet.class); 
     handler = new ExceptionMessageHandler(); 
     signupObservableAgent = new SignupServletObservableAgent(null, SERVLET_LOGGER); 
    } 
} 
+0

Inútil. La orden ya está garantizada. – EJP

Cuestiones relacionadas