Dúvida construtor [RESOLVIDO]

13 respostas
J

Olá pessoal,

Tenho dúvida referente a configuração dos atributos no método construtor. O correto é configurar os atributos no construtor pelos métodos sets, ou diretamente nas variáveis mesmo?

exemplo:

public Pessoa(String n, int i){ nome = n; idade = i }

ou

public Pessoa(String n, int i){ setNome(n); setIdade(i); }

Qual a forma correta ?

13 Respostas

Rodrigo_Sasaki

Aí acho que fica meio que à gosto do fregues hehehe

Eu particularmente não costumo usar os getters e setters dentro da própria classe, pois sempre digo que não deve haver lógica dentro deles, simplesmente atribuir um valor ao atributo (set) ou recuperá-lo (get).

Mas ja analisei códigos onde era usado o getter e o setter dentro da própria classe.

AlexandreGama

Como o @digaoneves tb não costumo usar desta forma mas alguns programadores usam quando existe uma validação/conversão/verificação/etc por exemplo (tb não gosto dessa forma)

public Pessoa(String n, int i){
    setNome(n);
    setIdade(i);
}

setNome(n) {
   if(n == "bla") {
      //algo de bom acontece
   }
}

setIdade(i) {
   i = i + 10 //por algum motivo tonto
}

Enfim, é parte gosto pessoal, parte design. Não gosto de validações dessa forma, mas há casos que são necessárias e úteis.
Se você não fará nada com o valor recebido pelo construtor, então não use getters e setters pois não faria sentido.

Abs!

daveiga

Embora eu não costume colocar lógica eu sempre uso set/get dentro da classe, simplesmente pra ter um lugar onde eu possa fazer alguma verificação ou validação de forma indolor no futuro.

É útil para colocar seus “breakpoints” também, e saber quem está setando o valor, e porque, mesmo dentro da classe.

Claro que você nunca deveria precisar disso dentro da própria classe, mas sabe como é, vai que…

Guike

Bom no meu caso uso o getters e setters pois eu gosto de proteger os atributos passando eles para private onde só a classe que o criou pode alterar seus valores, sendo assim usando os getters e setters para alterar os valores, protegendo eles assim de uma alteração indesajada do main sendo feita uma alteração direta ou para protected onde as sub também tem acesso, quanto a usar nos contstrutores isso fica a critério, se seu métodos forem protegidos provavelmente terá que usar, em um programa simples não faz muito sentido mas em um complexo faz a diferença

AlexandreGama

@Guike na verdade a dúvida dele é diferente (creio eu). A discussão é sobre colocar ou não setters e getters no proprio construtor. Se ele já tem getters e setters, os atributos dele
já são privados :wink:

AlexandreGama

@daveiga é interessante quando temos validações/etc mas msm assim acho desnecessário sempre chamar os setters e principalmente os getters.
É uma chamada de função a mais pra retornar o mesmo valor utilizando o atributo da propria classe. É meio poluido espalhar getters e setters
na classe dona dos atributos não? Delegações desnecessárias se vc realmente não precisa daquilo.

Mas isso só é uma opinião e não regra = )

Abs!

J

Olá pessoal,

Obrigado pelas dicas. Na verdade esta classe que coloquei como exemplo não é a verdadeira dificuldade. Mas a classe que estou pensando em colocar os setters e getters no construtor, precisa de uma grande validação nos parâmetros recebidos pelo construtor.

Sendo assim, qual seria a forma mais adequada para esta situação?

Rodrigo_Sasaki

jonathanleal:
Olá pessoal,

Obrigado pelas dicas. Na verdade esta classe que coloquei como exemplo não é a verdadeira dificuldade. Mas a classe que estou pensando em colocar os setters e getters no construtor, precisa de uma grande validação nos parâmetros recebidos pelo construtor.

Sendo assim, qual seria a forma mais adequada para esta situação?

a minha sugestão é você implementar um método que faz a validação, e depois disso setar o valor… e não deixar essa validação no seu método set

eu acho muito mais limpo quando você consegue ler a assinatura de um método e saber como ele funciona…

exemplo:

public boolean validarCPF(String cpf){
        //entende-se que esse método vai validar o CPF e retornar um boolean e SOMENTE isso
    }

    public void setCPF(String cpf){
        //entende-se que esse método vai atribuir o valor enviado como parâmetro à sua variável CPF
    }

agora ficar quebrando a cabeça pra descobrir o por que de não estar setando o valor que você envia, e ao ver a implementação do método perceber que existe uma validação… pode deixar as coisas complicadas…

ViniGodoy

Como o método validarCPF proposto é apenas auxiliar, deixe-o private ao invés de public.

Afinal, esse código seria no mínimo estranho:

Pessoa p = new Pessoa(); p.validarCpf("[telefone removido]"); p.validarCpf("[telefone removido]"); p.setCpf("[telefone removido]");

Rodrigo_Sasaki

ViniGodoy:
Como o método validarCPF proposto é apenas auxiliar, deixe-o private ao invés de public.

Afinal, esse código seria no mínimo estranho:

Pessoa p = new Pessoa(); p.validarCpf("[telefone removido]"); p.validarCpf("[telefone removido]"); p.setCpf("[telefone removido]");

ah sim hehe. nem me atentei a isso…
verdade, o método validarCPF deveria ser private…

mas e quanto à maneira mais “limpa” de se fazer?

acha que deve haver validação do dado no setter?

discorpio

Boa noite a todos.

Os métodos getters e setters são métodos para dar acesso a atributos encapsulados, isto não quer dizer que você não possa utilizá-los na mesma classe onde estão declarados os atributos privados, contudo não faz sentido utilizá-los dentro da mesma classe, a não ser para validação de dados.

Entretanto, se você utiliza a herança e passa os parâmetros no construtor da sub classe (classe filha), e os atributos estão declarados na classe pai, ai não só faz sentido, como não outro jeito de você acessar os atributos sem os getters e setters dentro do construtor da sub classe como dentro de qualquer outro método da sub classe.

Um abraço.

ViniGodoy

digaoneves:
mas e quanto à maneira mais “limpa” de se fazer?

acha que deve haver validação do dado no setter?

Só se a validação for muito simples, o que não é o caso aqui.
Nesse caso, eu criaria também esse método private.

AlexandreGama

Para uma validação um pouco menos simples, um método bastaria

public Pessoa(String n, int i){
    trataOsDadosComoEuPreciso(n, i);
}

private trataOsDadosComoEuPreciso(String n, int i) {
    //preciso de tal coisa, seja chamando outra classe, seja neste método mesmo
}

Abs!

Criado 20 de abril de 2012
Ultima resposta 21 de abr. de 2012
Respostas 13
Participantes 7