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);
}
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)
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
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
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?
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…
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
publicPessoa(Stringn,inti){trataOsDadosComoEuPreciso(n,i);}privatetrataOsDadosComoEuPreciso(Stringn,inti){//preciso de tal coisa, seja chamando outra classe, seja neste método mesmo}