rodrigo_corinthians 27 de nov. de 2007
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 27 de nov. de 2007
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?
thingol 27 de nov. de 2007
O que o compilador faz é o seguinte:
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.
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.
O Java, ao carregar a classe, chama o método “static { }”.
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 27 de nov. de 2007
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 ) {
}
}