Seria uma boa prática realizar a validação de um argumento passado para meu objeto no momento da criação dele? dentro do método SET? Como deveria tratar os casos de valores incorretos? com lançamento de uma IllegalArgumentException?
Seria uma boa prática realizar a validação de um argumento passado para meu objeto no momento da criação dele? dentro do método SET? Como deveria tratar os casos de valores incorretos? com lançamento de uma IllegalArgumentException?
Olá!
O método SET deve ser apenas modificador em uma classe de modelo. Se um atributo precisa de validação, o ideal é que essa validação seja realizada por outra classe para que o SET sirva apenas para a modificação de um atributo privado e fique claro o seu objetivo dessa forma.
Adalto, você poderia fazer um if, dentro no seu set, validando se o campo é valido, tipo assim.
public class Pessoa {
private Integer idade;
}
public void setIdade(Integer idade) {
if(idade < 0) {
System.out.println("ERRO");
} else {
this.idade = idade;
}
}
Então,
Eu criei um pequeno metodo e chamo ele no momento de fazer o SET.
public void setNome(String nome) {
this.nome = validaNotNull(nome);
}
public String validaNotNull(String value)throws IllegalArgumentException{
if(value == null || value.isEmpty()) throw new IllegalArgumentException("O valor não deve ser nulo ou vazio");
return value;
}
Agora não sei se está de acordo com padrões, se essa é uma boa prática, penso que seja uma lógica do meu modelo e poderia estar no meu POJO porém gostaria de opiniões.
Obrigado por enquanto! Ainda gostaria de mais opiniões...
estava lendo esse capítulo: https://www.caelum.com.br/apostila-java-orientacao-objetos/modificadores-de-acesso-e-atributos-de-classe/#6-2-encapsulamento o autor utiliza uma maneira parecida com a sua para validar o CPF. É interessante que a validação seja exposta em outro método para proteger variações na sua classe ou nas suas regras de negócio porque essa validação pode ser ou se tornar complexa no futuro (como no caso CPF) . por exemplo, no seu caso, voce poderia querer validar se o nome não começa com um número e sim com uma letra, daí voce deveria criar um método "validaNome" que contém todas essas validações necessárias e utilizá-lo no setter.
Já se a regra envolve outras classes, uma classe externa deveria ser responsável por realizar essa validação
Espero ter ajudado
De acordo com regras e convenções para nomenclatura de classes, pacotes, métodos, variáveis e constantes em Java. O seu método deve ser claro e realizar a tarefa que o nome dele sugere, entretanto no seu exemplo, o método set realiza outra função para posteriormente realizar a função descrita dele. Para uma melhor clareza do seu código sugiro que faça desse modo criando mais um método para tal.
public boolean insereNome( String nome) {
if (validaNotNull(nome) == true)
setNome(nome);
return true;
else //mensagem de erro de validação
return false;
}
Espero ter ajudado.
Oi, existe na programação orientada a objetos o conceito de encapsulamento, digamos, você compra um liquidificador, e no mesmo existe os botoes de velocidade e intensidade da rotação do mesmo, esses botões geralmente possuem uma parte plastica que proteje o consumidor de ter que colocar suas mãos na parte mecanica do mesmo, evitando assim um possivel choque ou acidente.
Esse conceito permite que os metodos get e set "protejam" tb usuario das classes, fazendo com que os mesmos não tenham que lidar com a validação do objeto, se estou passando um valor valido para o mesmo, dessa forma os metodos set podem servir sim para proteger o bom funcionamento assim como a consistencia do objeto.
Contudo para algumas validações mais complexas, ainda se faz necessario utilizar classes terceiras, principalmente quando se desconhece o valor correto e se necessita por exemplo fazer uma consulta a um banco de dados, mas no geral as validações no metodo set são sim bem vindas.