Pergunta

Eu sei o que é estático bloco init funciona.
Alguém por favor pode me dizer alguns dos usos mais comuns do que ele.

Foi útil?

Solução

Quando você deseja inicializar uma ou mais variáveis estáticas em um só lugar

É útil, porque você pode aplicar o tratamento de exceção, o que não é possível com a linha de inicialização.

Por exemplo:

public static ImageIcon defaultIcon = ImageIO.read(..);

pode ser inicializado com

public static ImageIcon defaultIcon;
static {
   try {
       defaultIcon = ImageIO.read(..);
   } catch (IOException ex){
     System.out.println("No default icon available");
   }
}

Outra aplicação é complexa a inicialização.Por exemplo, se um item requer mais do que uma linha de código para ser inicializado.Digamos que você tenha uma configuração:

public static Configuration configuration;
static {
     confuguration = new Configuration();
     configuration.setSomething(..);
     configuration.setSomethingElse(..);
     ...
}

Um terceiro uso é para inicializar alguns API externa de infra-estrutura.Um exemplo do meu projeto atual:

static {
    org.apache.xml.security.Init.init();
}

Mas, como Mykola Golubyev observado, inicialização estática blocos de tornar o código menos legível, por isso use-os com cuidado.métodos estáticos fazer a mesma coisa de forma mais transparente.

Outras dicas

Apenas tente evitar o uso do bloco de inicialização estática. Em vez disso, você pode usar funções privadas de inicialização estática que tornarão seu código mais limpo.

Vou me referir a @bozho para exemplos.

Não faça

public static Configuration configuration;
static {
     confuguration = new Configuration();
     configuration.setSomething(..);
     configuration.setSomethingElse(..);
     ...
}

Use em vez disso

public static Configuration configuration = createConfiguration();

ou

public static Configuration configuration = YourConfiguration.create();

Eles são muitas vezes utilizados em conjunto com JNI código para garantir que o nativo necessária biblioteca é carregada:

class MyJniConnection {

    public static native void myJniCall();

    static {
        System.load("native.dll");
    }
}
  • Inicializando um campo estático de coleção, como mapa, lista, conjunto, etc
  • Inicializando o objeto baseado em setter que também é estático

Driver JDBC é um exemplo popular

Por que voce precisa Class.forName() para carregar um driver na memória. A resposta é simples. Conforme estipulado nas especificações do JDBC, todos os JDBC Driver ter um bloqueio estático para se registrar DriverManager assim que o Driver A classe é carregada. Algo assim:

static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}

Então, quando você escreve (por exemplo, com o driver MySQL aqui):

Class.forName("org.gjt.mm.mysql.Driver");

O carregador de classe tenta carregar e vincular o org.gjt.mm.mysql.Driver classe e, se for bem -sucedido, o bloco de inicialização estática é executado e o Driver registra -se com o DriverManager.

Eles podem ser usados para criar uma DSL, como JMock faz.Por exemplo, para definir uma expectativa de que um usuário serão salvas no banco de dados:

Mockery context = new Mockery();
final Database database = context.mock(Database.class);    
...
context.checking(new Expectations() {{
    oneOf(database).save(user);
}});

// Rest of the test
  • Bloco estático:- Quando queremos executar o código no momento do carregamento da aula, podemos colocar o código no bloco estático ...
  • init:- Quando queremos executar o código no momento do início do objeto de uma classe, podemos colocar o código no bloco init ....
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top