Dúvida com validação de dados no construtor

Boa tarde pessoal.

Tenho uma dúvida com relação ao método construtor e os set de uma classe:

A classe “Pessoa”, possui campos como, telefone, email, etc. Estes atributos devem ser validados, para não correr o risco de ser criado objetos inconsistentes. Também, quando instanciado, um objeto do tipo “Pessoa” deve receber por padrão alguns valores, como o nome, telefone, email. Devo assim fazer duas validações desses dados? Uma no método construtor e outra no set? Pois pelo que andei lendo, não se deve chamar métodos set direto no construtor, quando a classe em questão não é do tipo final.

Qual a melhor maneira para se resolver essa questão?

Agradeço desde já. Abraços!

desconheço essa informação, acredito que possa usar os setters dentro do construtor da própria classe. Eu sempre usei justamente para validação de dados.

Sandro, primeiramente obrigado pela resposta.

Sobre o que falei, eu encontrei isso aqui no próprio site, segue o link: Método set descarta necessidade de construtor?

Perceba o comentário do ViniGodoy.

Abraços!

vc tem que pensar assim: o seu construtor precisa ser capaz de construir (ahá) um objeto valido.

se o objeto tiver um telefone invalido ( tipo 2345MEIA78 ) então o objeto é invalido?

via de regra, seu Construtor deve ser simples, legivel. se ele começa a ser complexo vc deve pensar

1- sera que sua classe não é muito grande, fazendo coisas demais, podendo ser quebrada em classes menores usando composição?
2- sera que vc não precisa de uma Fabrica de objetos ( padrão Factory ) ?
3- sera que vc não precisa de um IoC/ injecão de dependencias na criação e ciclo de vida dos seus objetos?

as vezes, para objetos que vão representar algo util, vc pode começar com um objeto “em branco” e ir adicionando informações. nesse caso o construtor pode ser omitido. A pessoa nao tem nome, nao tem nada? sera que faz sentido? as vezes pra constuir dados a partir de um arquivo pode ser interessante vc ter menos regras, menos validações, e verificar a integridade de outra forma ( metodo isValid, por exemplo, ou vc pode usar um validador externo ).

como sempre, veja o que faz sentido na sua modelagem

cuidado se vc tem herança.

1 curtida

poisé foi bom você me apontar isso, o fato é que as classes que eu faço validação geralmente são final.