Existem quaisquer garantias em JLS sobre a ordem de execução de inicialização estático blocos?

StackOverflow https://stackoverflow.com/questions/3028219

  •  26-09-2019
  •  | 
  •  

Pergunta

Gostaria de saber se é confiável para usar uma construção como:

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

Há uma possibilidade de que eu vou chegar NullPointerException porque msgSource a inicialização do bloco será executado antes que o bloco que inicializa engMessages?

(sobre, por que não posso fazer msgSource inicialização no fim do superior init.bloco:só uma questão de gosto;Eu vou fazer isso se o descrito construção não é confiável)

Foi útil?

Solução

Sim, inicializador estático blocos são garantidos para executar textual ordem.

A partir da JLS, seção 12.4.1:

A intenção é que uma classe ou interface, um conjunto de inicializadores que colocá-lo em um estado consistente, e que este estado é o primeiro estado que é observada por outras classes. Os inicializadores estáticos e variável de classe inicializadores de são executados na ordem textual, e não se pode referir a classe de variáveis declaradas na classe cujas declarações aparecem textualmente após o uso, mesmo que estas variáveis de classe são de âmbito (§8.3.3).Esta restrição é projetado para detectar, em tempo de compilação, mais circular ou corrompido inicializações.

E a partir de 12.4.2:

De seguida, execute a variável de classe inicializadores estáticos e de inicializadores da classe, ou o campo de inicializadores de interface, na ordem textual, como se fossem um único bloco.

Pessoalmente, porém, eu gostaria de colocar todas as declarações de variáveis em iniciar e, em seguida, um único inicializador estático bloco.Eu considero que para ser muito fácil de seguir.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top