2010-12-15 82 views
29

D'accord, alors que j'ai une classe qui ressemble à ceci:Java: dans quel ordre les champs finals statiques sont-ils initialisés?

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

Puis-je compter sur le chargeur de classe pour initialiser ces champs dans l'ordre, de telle sorte que je peux compter sur SERVLET_LOGGER à instancier avant signupObservableAgent?

Répondre

44

Oui, ils sont initialisés dans l'ordre dans lequel ils apparaissent dans la source. Vous pouvez lire tous les détails sanglants dans The Java Language Specification, §12.4.2. Voir l'étape 9, qui se lit comme suit:

... exécuter soit les initialiseurs variables de classe et initialiseurs statiques de la classe, ou le champ initializers de l'interface, dans l'ordre textuel, comme si elles étaient un seul bloc, à l'exception que les variables de classe finale et les champs d'interfaces dont les valeurs sont des constantes de temps de compilation sont initialisés en premier ...

+0

Génial - merci! – sangfroid

3

Je pense que l'initialisation de champs statiques pourrait être réordonnée. Au moins c'est-ce que je comprends JMM specification

Il y a un certain nombre de cas où les accès à des programmes variables (champs d'instance d'objets, les champs statiques de la classe, et les éléments du tableau) peuvent apparaître à exécuter dans un ordre différent de celui a été spécifié par le programme.

+3

Cette partie indique également "... et la valeur de b ne dépend * pas * de la valeur de a, alors le compilateur est libre de réorganiser ces opérations, ..." –

+0

La citation concerne les accès, pas les initialisations. – EJP

1

si la sous-classe et la super classe sont présentes.

  1. EX: 'A': super classe 'B': sous classe et il étend super classe 'A'
  2. lorsque la classe B chargée puis une classe charge également
  3. toutes les variables statiques obtenir de la mémoire avec la valeur par défaut des classes 'A' et 'B'
  4. puis les membres statiques (variable statique, bloc statique) sont exécutés dans l'ordre du haut vers le bas de la classe 'A' puis de la classe 'B' dans l'ordre où ils sont déclarés. enfin la méthode principale exécutée automatiquement à partir de la sous-classe.
-1

Ceci est un endroit où vous pouvez utiliser un bloc statique qui garantirait la séquence d'exécution.

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

Sans objet. La commande est déjà garantie. – EJP