Blocos de Inicialização Estáticos

7 respostas
adriano_si

Prezados, de fato, alguém usa os blocos de inicialização pra alguma coisa útil ?? é que estudando sobre eles, ainda não enxerguei uma aplicaçao real para o mesmo… sei lá parece meio Anti-OO… estou enganado ??

Alguém poderia me exemplificar um uso real desses blocos ??

Att.

7 Respostas

ViniGodoy

Você pode querer ter um list, ou outro objeto complexo, como constante.

public class Exemplo {
   public static final List<String> NOMES;

   static {
        List<String> nomes = new ArrayList<String>();
        nomes.add("João");
        nomes.add("Marcelo");
        nomes.add("José");
        NOMES = Collections.unmodifiableList(nomes);
   }
}
E

Você pode usar isso se precisar efetuar alguma inicialização de uma variável estática que seja mais complexa (por exemplo, envolvendo métodos que podem potencialmente lançar exceções - mesmo que você saiba que elas nunca serão lançadas). Por exemplo:

class Teste {
    private static Random r;
    static {
        try {
            r = SecureRandom.getInstance("SHA1PRNG");
        } catch (NoSuchAlgorithmException ex) { }
    }
    ...
}

No código acima, porque tenho de usar getInstance, e ele lança uma exceção NoSuchAlgorithmException, sou obrigado a pôr um try/catch. Veja que por causa disso não posso usar a seguinte inicialização:

class Teste {
    private static Random r = SecureRandom.getInstance("SHA1PRNG");
    ...
}
J

Vamos supor que você esteja usando jdbc puro, sem JPA ou qlqr coisa do tipo, e queria fazer um cache de objetos que são registros de tabela, para não ter que ficar sempre acessando o banco de dados.

para esse cache, você cria um hashtable para segurar as referências desses objetos, porem, você pode configurar tb um timeout nesse hashtable.

entao teria algo mais ou menos assim:

public class MyDBObject {
    private static final MyCachedHashtable CACHE;
    
    static {
          CACHE = new MyCacheHashtable();
          CACHE.configureTimeout(15 * 60 * 1000);
          CACHE.setMaxKeys(500);
    }

   public MyDBObject(){
   }
   
   // getters & setters
}

Você poderia fazer com que cada método do hashtable retorna-se ele mesmo, então você conseguiria instanciar e configurar tudo em uma mesma linha:

// código antes
private static final MyCachedHashtable CACHE = new MyCacheHashtable().configureTimeout(15 * 60 * 1000).setMaxKeys(500);
// código depois

mas tb não vai ficar algo agradável de se ver e entender.

tem outras utilidades para ele, essa é apenas uma delas

[]'s

adriano_si

Valew galera… de fato o conceito já entendí… mas… onde vcs usam isso na prática ?? Tem algum sistema que vcs estão trabalhando (ou trabalharam) que esteja de fato se beneficiando desse recurso ???

Valew pelos exemplos…

J

sim… o exemplo que dei eu uso na prática, na empresa em que trabalho, não usamos JPA ou qlqr outro framework para acesso ao banco de dados… nos desenvolvemos nosso prórprio, devido a algum motivos, um deles foi a performace.

[]'s

renamed

é realmente esse static era meio complicado pra mim também, mas com tantas explicações eu entendi a parada… q maneiro! =)

Vini_Fernandes

Ola, também já tive essa dúvida. Esse link me ajudou!

http://raphaelrodrigues.wordpress.com/2009/12/05/blocos-de-inicializacao-estaticos-e-nao-estaticos/

T+

Criado 27 de outubro de 2009
Ultima resposta 10 de fev. de 2010
Respostas 7
Participantes 6