Java: ¿en qué orden se inicializan los campos finales estáticos?

De acuerdo, entonces di que tengo una clase que se ve así:

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 esos campos en orden, de modo que pueda confiar en SERVLET_LOGGER para crear una instancia antes de signupObservableAgent?

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 finales y los campos de interfaces cuyos valores se comstackn. las constantes de tiempo se inicializan primero …

Creo que la inicialización de campos estáticos podría reordenarse. Al menos así es como entiendo la especificación JMM

Hay una serie de casos en los que los accesos a variables de progtwig (campos de instancia de objeto, campos estáticos de clase y elementos de matriz) pueden aparecer para ejecutarse en un orden diferente al especificado por el progtwig.

si subclase y superclase están allí.

  1. EX: ‘A’: superclase ‘B’: subclase y se extiende superclase ‘A’
  2. cuando la clase B se cargó, una clase también carga
  3. todas las variables estáticas obtienen memoria con valor predeterminado de la clase ‘A’ y ‘B’
  4. a continuación, 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.

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); } }