Anotei aí. @Annotations

Este é um assunto que nunca estudei, e sempre achava que seria um bicho de 7 cabeças. Mas dando uma olhada, percebi 98163555que é até bem fácil e uma mão na roda em várias situações. Você só não pode se empolgar e sair utilizando em tudo quanto é lugar. Use com moderação!

A criação de um Annotation é muito fácil. Você cria um novo .java, que ao invés de ter a palavra chave class usa @interface. Coloque alguns Annotations(use annotation para criar annotation, eita) e pronto, antes do miojo ficar pronto o annotation já estará finalizado.


@Target(ElementType.FIELD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Requerido {
 long menorValor() default 0;
 long maiorValor() default Long.MAX_VALUE;
 }

Vamos criar um objeto qualquer para anotar suas propriedades com o nosso novo Annotation quentinho que acabou de sair do forno.

 
public class UmObjetoAnotatdo {
	
	@Requerido(menorValor=10, maiorValor=100)
	public int valorProduto;
	
	@Requerido
	public String nome;
	
	@Requerido
	public short valorCusto;

}

12635a-800x600
Onde as coisas complicam um pouco é na hora de perceber o annotation em uma classe ou propriedade em runtime. Tem um trabalhinho chato de ficar percorrendo o objeto, a procura do annotation para fazer o que o seu annotation foi criado para fazer.

No caso criei uma anotação para verificar automaticamente se campos obrigatórios de um objeto foram preenchidos e se ele respeita seu valor mínimo e máximo, se isso não for respeitado levanto  uma exceção. Infelizmente este código tem um pouco de recursão, sempre evito utilizar, mas neste caso achei que cairia bem.

public class TestarAnnotation {
	
	public static void validaCamposObrigatorios(Object dto) throws Exception {
		Field[] camposDoObjeto = dto.getClass().getDeclaredFields();
		for (int i = 0; i < camposDoObjeto.length; i++) { if (camposDoObjeto[i].isAnnotationPresent(Requerido.class)) { camposDoObjeto[i].setAccessible(true); Object valorDoCampo = camposDoObjeto[i].get(dto); if (valorDoCampo == null) throw new Exception("O campo " + camposDoObjeto[i].getName() + " é obrigatório. Valor Recebido: " + valorDoCampo); camposDoObjeto[i].isAnnotationPresent(Requerido.class); Requerido anotacao = camposDoObjeto[i].getAnnotation(Requerido.class); if (valorDoCampo instanceof String) { if (((String) valorDoCampo).equalsIgnoreCase("")) throw new Exception("O campo " + camposDoObjeto[i].getName() + " é obrigatório. Valor Recebido: " + valorDoCampo); } else if (valorDoCampo instanceof Long) { if (anotacao.menorValor() >= (Long) valorDoCampo)
						throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor maior que: "
								+ anotacao.menorValor());
					if (anotacao.maiorValor() <= (Long) valorDoCampo) throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor menor que: " + anotacao.maiorValor()); } else if (valorDoCampo instanceof Integer) { if (anotacao.menorValor() >= (Integer) valorDoCampo)
						throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor maior que: "
								+ anotacao.menorValor());
					if (anotacao.maiorValor() <= (Integer) valorDoCampo) throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor menor que: " + anotacao.maiorValor()); } else if (valorDoCampo instanceof Short) { if (anotacao.menorValor() >= (Short) valorDoCampo)
						throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor maior que: "
								+ anotacao.menorValor());
					if (anotacao.maiorValor() <= (Short) valorDoCampo)
						throw new Exception("O campo " + camposDoObjeto[i].getName() + " deve ter um valor menor que: "
								+ anotacao.maiorValor());
				} else {
					validaCamposObrigatorios(dto);
				}
			}
		}
	}
	public static void main(String[] args) throws Exception {
		UmObjetoAnotatdo objeto = new UmObjetoAnotatdo();
		objeto.nome = null;
		objeto.valorCusto = 1;
		objeto.valorProduto = 11;		
		
		try{
			TestarAnnotation.validaCamposObrigatorios(objeto);
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
		
		objeto.nome = "Marcelo";
		objeto.valorCusto = 1;
		objeto.valorProduto = 1;		

		try{
			TestarAnnotation.validaCamposObrigatorios(objeto);
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}

		objeto.nome = "Marcelo";
		objeto.valorCusto = 0;
		objeto.valorProduto = 11;		

		try{
			TestarAnnotation.validaCamposObrigatorios(objeto);
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}
}

Executando a classe você receberá as mensagens:


O campo nome é obrigatório. Valor Recebido: null
O campo valorProduto deve ter um valor maior que: 10
O campo valorCusto deve ter um valor maior que: 0

A primeira mensagem é porque a propriedade nome não está preenchida, a segunda porque o campo valorProduto está com um valor que não é maior que o mínimo de 10, e a terceira é porque o campo valorCusto deve possuir um valor maior que 0 para ser considerado preenchido.

Altera os valores das propriedades e veja qual o comportamento.

Espero ter ajudado alguém com este post! Boa noite pessoal!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s