Olá Pessoal,
Preciso de uma ajuda com a melhoria de validação de parâmetros, tenho atualmente alguns métodos representados pelos exemplos abaixo (methodoOne,methodotwoe,methodothree) em que recebe um objeto e uma String adicional, e antes de realizar a ação preciso validar se os parâmetros recebidos são válidos ( !=null && !isEmpty()), porém tenho uma repetição de códigos com ifs e quero melhor isso. Vi algo com a classe Errors mas ainda não utilizei e quero solicitar ajuda dos colegas que tenham implementado algo similar.
public void methodoOne (Object objetoRecebido, String parametro1) {
if ( objetoRecebido != null && !parametro1.isEmpty() ) {
if ( !objetoRecebido.um() && !objetoRecebido.dois() && !objetoRecebido.tres() ) {
// Faça alguma coisa
} else {
throw new IllegalArgumentException();
}
}
}
public void methodoTwo (Object objetoRecebido, String parametro2) {
if ( objetoRecebido != null && !parametro2.isEmpty() ) {
if ( !objetoRecebido.um() && !objetoRecebido.dois() && !objetoRecebido.tres() ) {
// Faça alguma coisa
} else {
throw new IllegalArgumentException();
}
}
}
public void methodoThree (Object objetoRecebido, String parametro3) {
if ( objetoRecebido != null && !parametro3.isEmpty() ) {
if ( !objetoRecebido.um() && !objetoRecebido.dois() && !objetoRecebido.tres() ) {
// Faça alguma coisa
} else {
throw new IllegalArgumentException();
}
}
}
// Nova implementação
public void validate(Object objetoRecebido, Errors erros) {
}
public class Main {
public static void main(String[] args) throws Exception {
new Main().testar();
}
public void testar() {
// Chama o método "execute" passando os argumentos e qual a função que será executada
execute(new MyObject(), "parametro1", methodOne());
execute(new MyObject(), "parametro2", methodTwo());
execute(new MyObject(), "parametro2", methodThree());
}
// Como as validações são iguais, coloquei elas num único método que será o responsável
// por executar a ação (Execution)
public void execute(MyObject objetoRecebido, String parametro, Execution execution) {
if (objetoRecebido != null && !parametro.isEmpty()) {
if (!objetoRecebido.um() && !objetoRecebido.dois() && !objetoRecebido.tres()) {
execution.execute(objetoRecebido, parametro);
} else {
throw new IllegalArgumentException();
}
}
}
// Os métodos (methodOne, methodTwo e methodThree) que definem as execuções em cima do parâmetros "objetoRecebido" e "parametro"
// irá retornar uma função lambda (java8) que define o que será processado
public static Execution methodOne() {
return (MyObject objetoRecebido, String parametro) -> {
System.out.println("methodOne: " + objetoRecebido + " - " + parametro);
};
}
public Execution methodTwo() {
return (MyObject objetoRecebido, String parametro) -> {
System.out.println("methodTwo: " + objetoRecebido + " - " + parametro);
};
}
public Execution methodThree() {
return (MyObject objetoRecebido, String parametro) -> {
System.out.println("methodThree: " + objetoRecebido + " - " + parametro);
};
}
// Define um contrato para execução para os parâmetros "objetoRecebido" e "parâmetro", ous seja,
// Força a quem for usar, criar um método que recebe esses 2 parametros e faz algo com eles
@FunctionalInterface
private interface Execution {
void execute(MyObject objetoRecebido, String parametro);
}
// Criei essa classe apenas para ter os métodos "um", "dois" e "tres" para poder testar
private static class MyObject {
public boolean um() {
return false;
}
public boolean dois() {
return false;
}
public boolean tres() {
return false;
}
}
}
Precisa de java8 ou superior
Lucas muito obrigado pelo retorno, mas confesso que não consegui enteder bem a lógica de forma que possa aplicar a solução, consegue detalhar o passo a passo que elaborou ?
Desde já muito obrigado.
Editei o exemplo com alguns comentários. Veja se tu entende lah de boa.