Inicialização de atributos de uma classe

4 respostas
matheusfernal

Qual é a diferença entre inicializar o atributos de uma classe na decração ou no construtor?

Exemplo:

public class C {

  private Object o  = new Object();

  public C () {
  }

}

e

public class C {

  private Object o;

  public C () {
    this.o = new Object();
  }

}

4 Respostas

rodrigo_corinthians
Nenhuma desde que o construtor não seja sobrecarregado(overload)...
public class Teste {
	private Integer id = new Integer(10);
	
	public Teste() {}
	
	public Teste(boolean value) {
		id = 20;
	}

	public Teste(Integer value) {
		id = value;
	}
	
	public Integer getId() {
		return id;
	}

	public static void main(String[] args) throws Exception {
		System.out.println(new Teste().getId());
		System.out.println(new Teste(true).getId());
		Teste test = (Teste) Class.forName("Teste").getConstructor(Integer.class).newInstance(new Integer(30));
		System.out.println(test.getId());
	}

}
matheusfernal

Então criar um Sigleton

public class C {  
  
  private static C instance  = new C();  
  
  private C () {  
  }  

  public static C getInstance() {
    return instance;
  }
  
}

teria o mesmo problema de concorrência que

public class C {  
  
  private static C instance  = null;  
  
  private C () {  
  }  

  public static C getInstance() {
    if (instance == null) {
      instance = new C();
    }
    return instance;
  }
  
}

(Se duas threads acessarem “simultâneamente” a instância retornada poderia não ser a mesma)

Certo?

T

O que o compilador faz é o seguinte:

  1. Ele junta todas as inicializações de variáveis estáticas e move para um método “static { }”, pela ordem em que estão declaradas dentro da classe.
  2. Ele junta todas as inicializações de variáveis de instância e move para um método “{ }”, pela ordem em que estão declaradas dentro da classe.
  3. O Java, ao carregar a classe, chama o método “static { }”.
  4. Ao instanciar um objeto dessa classe, cada construtor chama o método “{ }”.

Exemplo:

class Classe1 {
    private double z;
    private int x = 10;
    private static y = 20;
    public Class1 () { 
        z = 2.34;
    }
}
... equivale a: ...
class Classe1 {
    private double z;
    private int x;
    private static y;
    {
         x = 10;
    }
    static {
         y = 20;
    }
    public Class1 () { 
        z = 2.34;
    }
}

que é executado como:
y = 20; // estático é executado quando se carrega a classe
x = 10; // no construtor chamamos primeiro o bloco “{ }”
z = 2.34; // agora executamos o que está declarado dentro do construtor.

everson_z

Se vc colocar uma sobrecarga no construtor, nem sempre vai se chamado

public class C {  
      
      private Object o;  
      
      public C () {  
        this.o = new Object();  
      }

      public C (String y) {  
         
      }
      
   }
Criado 27 de novembro de 2007
Ultima resposta 27 de nov. de 2007
Respostas 4
Participantes 4