10 Mar
Java possui um bloco de código que é executado antes dos contrutores da sua classe, mas depois que sua classe já está carregada para a memória.
public class Teste {
public static void main(String []args){
A a;
//Vamos criar 3 instâncias de A
for (int i = 0; i < 3; i++)
a = new A();
System.out.println("Depois de criar a instância");
}
}
class A {
static {
System.out.println("Bloco Estático");
}
{
System.out.println("Pré Contrutor");
}
A(){
this(0);
System.out.println("Construtor sem parâmetro");
}
A(int i){
System.out.println("construtor com parâmetros");
}
}
Rodando esse código estranho, a saída é a seguinte:
Bloco Estático
Pré Contrutor
construtor com parâmetros
Construtor sem parâmetro
Pré Contrutor
construtor com parâmetros
Construtor sem parâmetro
Pré Contrutor
construtor com parâmetros
Construtor sem parâmetro
Depois de criar a instância
Notem que o pré construtor só é executado uma vez para cada instância que você cria, independente se você chama vários construtores.
Mas a parte mais assustadora é que você pode ter vários pré construtores, e eles são executados na ordem em que aparecem na sua classe (quero ver alguém falar bem de Java agora ;) )
public class Teste {
public static void main(String []args){
A a = new A();
}
}
class A {
{
System.out.println("Pré Construtor de Cima");
}
A(){
System.out.println("Construtor");
}
{
System.out.println("Pré Contrutor de Baixo");
}
}
A saída é:
Pré Construtor de Cima
Pré Contrutor de Baixo
Construtor
Bem feio, não?
Posts Relacionados:
Assine nosso RSS feed!
4 Responses for "INC - Pré construtores"
Nossa! Que bizarro!
Afinal, para que serve um pré-construtor!?!? Que coisa feia!
Olá Luiz,
A idéia do pré construtor é você poder isolar em um único lugar toda a lógica que você quer que seja executado por todos os seus construtores. Isso evita que você precise ficar copiando e colando código entre construtores (deixando seu código menos DRY).
Hmm… A intenção é boa, mas escrever um único construtor (ou uma função separada) que contenha toda essa lógica e fazer com que os outros o chamem não funciona tão bem quanto? A meu ver, o pré-construtor é desnecessário.
Olá Luiz,
Concordo com você que vários pré construtores é uma idéia meio boba (provavelmente ninguém vai usar….) porque você pode colocar tudo em uma função que delega para outras. Mas o pré construtor acaba sendo útil quando você têm vários contrutores. Se você tivesse que chamar uma mesma função em todos os construtores, daqui 5 meses, quando alguém por algum motivo criasse um novo contrutor, ele poderia esquecer de colocar a função e iria deixar sua classe inconcistente… Usando o pré construtor isso não tem como acontecer.
Leave a reply