Qual é a diferença entre definindo e inicializando as variáveis de membro no início da definição de classee definindo as variáveis de membro primeiro e inicializando as variáveis de membro no construtor?
Digamos, por exemplo:
public class Test {
private int foo = 123;
private boolean flag = false;
public void fooMethod() {...}
}
Versus:
public class Test {
private int foo;
private boolean flag;
public Test() {
foo = 123;
flag = false;
}
public void fooMethod() {...}
}
Desde já, obrigado.
Respostas:
21 para resposta № 1No seu exemplo, a única diferença é quando elessão inicializados. De acordo com o JLS, as variáveis de instância são inicializadas antes que o construtor seja chamado. Isso pode se tornar interessante quando você tem super classes para lidar, já que a ordem de inicialização nem sempre é tão óbvia. Com isso, lembre-se de que variáveis de instância "super" ainda serão inicializadas quando nenhum super construtor explícito for chamado.
7 para resposta № 2
A diferença é a ordem em que eles são inicializados / definidos.
Suas variáveis de membro de classe serão declaradas / definidas antes que seu construtor seja chamado. Minha preferência pessoal é defini-los no construtor.
2 para resposta № 3
Inicialização em classe permite evitar escrever um construtor trivial.
Você precisa inicializar os membros da instância quedependem dos parâmetros do construtor dentro do construtor. Poderia ser razoável, para facilitar a leitura, se nada mais, colocar a inicialização de todos os outros membros da instância dentro do mesmo construtor.
Caso contrário, não há diferença.
0 para a resposta № 4
Normalmente, um construtor aceita argumentos e atribui esses argumentos aos campos da classe.
public Test(int foo, boolean flag)
{
this.foo = foo;
this.flag = flag;
}