static static vs private static method para inicialização de membro estático

9

As variáveis estáticas podem ser inicializadas com os métodos estáticos privados ou com um bloco estático. Existe alguma diferença sutil entre os dois? Existe alguma situação em que não posso usar o método estático para inicializar membros estáticos? Eu achei o último mais legível.

Inicialização do bloco estático:

private static int NUM_ITER;
static {
    // Operations
    NUM_ITER = //val from above operations.
}

Inicialização do método estático privado:

private static int NUM_ITER = calculateNumIter();

// Some method comment on how we are calculating.
private static int calculateNumIter()
{
    // Operations.
    return //value_from_operations.
}

Eu prefiro o segundo porque é mais legível. Existe alguma situação que eu tenho que usar apenas primeiro (blocos estáticos)?

Qual é a melhor convenção / design de codificação para inicializar membros estáticos (tanto final quanto variável)? Mesmo a partir deste tópico , aprendi que métodos estáticos privados têm uma vantagem sobre os blocos estáticos.

obrigado,

    
por Mohan 23.07.2012 в 20:48
fonte

3 respostas

2

O bloco estático seria necessário (ou pelo menos útil) se duas variáveis diferentes forem interdependentes e não puderem ser inicializadas independentemente.

Suponha que você precise ler dois valores de um arquivo, por exemplo. Você pode armazenar os dois valores em um objeto adicional. Mas se você realmente quer duas constantes, um bloco estático é útil.

    
por JB Nizet 23.07.2012 / 20:50
fonte
2

Eu sugiro usar qualquer sintaxe para manter seu código limpo e legível:

  • se a inicialização for de um, no máximo dois, linhas de código muito simples, então vá com o bloco estático;

  • se a inicialização for uma operação complexa, um método com um bom nome será melhor;

  • em dúvida, use a sintaxe do método e use o nome do método para declarar não apenas qual variável, mas também como você está inicializando (isto é, initializeValueWithRandomNumber ());

por Matteo Caprari 23.07.2012 / 21:04
fonte
1
  1. static Initializer block (Sua 1 opção) é executado quando a JVM carrega a classe, mesmo antes de qualquer variável static é inicializada.

  2. É um bom lugar para ter todas as variáveis estáticas de uma só vez.

  3. Sua segunda opção pode ser usada opcionalmente para inicializar várias static variáveis passando vários argumentos ao parâmetro do método de inicialização.

por Kumar Vivek Mitra 23.07.2012 / 20:56
fonte