No Capítulo 1, abordamos os inicializadores de instância que pareciam métodos sem nome. Apenas codifique dentro de chaves. Inicializadores estáticos parecem semelhantes. Eles adicionam a palavra-chave estática para especificar deve ser executado quando a classe for usada pela primeira vez. Por exemplo:
private static final int NUM_SECONDS_PER_HOUR;
static {
int numSecondsPerMinute = 60;
int numMinutesPerHour = 60;
NUM_SECONDS_PER_HOUR = numSecondsPerMinute * numMinutesPerHour;
}
O inicializador estático é executado quando a classe é usada pela primeira vez. As instruções nele executadas e atribua quaisquer variáveis estáticas conforme necessário. Há algo interessante sobre este exemplo. Acabamos de dizer que as variáveis finais não podem ser reatribuído. A chave aqui é que o inicializador estático é a primeira atribuição. E, como ocorre na frente, está tudo bem. Vamos tentar outro exemplo para garantir que você entenda a distinção:
14: private static int one;
15: private static final int two;
16: private static final int three = 3;
17: private static final int four; // DOES NOT COMPILE
18: static {
19: one = 1;
20: two = 2;
21: three = 3; // DOES NOT COMPILE
22: two = 4; // DOES NOT COMPILE
23: }
A linha 14 declara uma variável estática que não é final. Pode ser atribuído quantas vezes preferir. A linha 15 declara uma variável final sem inicializá-la. Isso significa que podemos inicializá-lo exatamente uma vez em um bloco estático. A linha 22 não compila porque esta é a segunda tentativa. Linha 16 declara uma variável final e a inicializa ao mesmo tempo. Não temos permissão para atribuí-lo novamente, para que a linha 21 não seja compilada. A linha 17 declara uma variável final que nunca é inicializada. O compilador gera um erro do compilador porque sabe que os blocos estáticos são o único local a variável pode ser inicializada. Desde que o programador esqueceu, isso é claramente um erro.
Tente evitar inicializadores estáticos e de instância
O uso de inicializadores estáticos e de instância pode tornar seu código muito mais difícil de ler. Tudo o que poderia ser feito em um inicializador de instância poderia ser feito de uma maneira estruturada. A abordagem do construtor é mais fácil de ler.
Existe um caso comum para usar um inicializador estático: quando você precisa inicializar um campo estático e o código para isso requer mais de uma linha. Isso geralmente ocorre quando você deseja inicializar uma coleção como um ArrayList. Quando você precisar usar um inicializador estático, coloque toda a inicialização estática no mesmo bloco. Dessa maneira, a ordem é óbvia