Question

Je me demande s'il est fiable d'utiliser une construction comme:

private static final Map<String, String> engMessages;
private static final Map<String, String> rusMessages;

static {
    engMessages = new HashMap<String, String> () {{
        put ("msgname", "value");
    }};
    rusMessages = new HashMap<String, String> () {{
        put ("msgname", "значение");
    }};
}

private static Map<String, String> msgSource;

static {
    msgSource = engMessages;
}

public static String msg (String msgName) {
    return msgSource.get (msgName);
}

Est-il possible que je vais NullPointerException parce que le bloc d'initialisation de msgSource sera exécutée avant que le bloc initialisant engMessages?

(environ pourquoi ne pas faire l'initialisation de msgSource à la fin du bloc supérieur d'initialisation. Juste la question de goût, je le ferai si la construction décrite est peu fiable)

Était-ce utile?

La solution

Oui, statique initialiseur blocs sont garantis à exécuter dans l'ordre textuel.

De la JLS, section 12.4.1 :

  

Le but est qu'un type de classe ou de l'interface a un ensemble de initializers qui le placent dans un état cohérent, et que cet état est le premier état qui est observé par d'autres classes. Les initialiseurs statiques et initializers variables de classe sont exécutées dans l'ordre textuel, et ne peut pas se référer à des variables de classe déclaré dans la classe dont les déclarations apparaissent textuellement après l'utilisation, même si ces variables de classe sont une portée (§8.3 .3). Cette restriction est conçu pour détecter, au moment de la compilation, la plupart des initialisations circulaires ou autrement malformés.

Et de 12.4 0,2 :

  

Ensuite, exécutez l'une des initialiseurs variables de classe et initialiseurs statiques de la classe, ou le champ initializers de l'interface, pour textuelle , comme si elles étaient un seul bloc.

Personnellement, cependant, je mettrais toutes les déclarations variables au début, puis un seul bloc statique initialiseur. Je considère que, pour être beaucoup plus facile à suivre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top