sábado, 9 de maio de 2009

@Annotation em acima de tudo

annotation
Quem nunca viu um @annotation em algum código java que atire a primeira pedra. O Annotation surgiu na versão 5 do JDK(codename Tiger) e o cara responsável pela JSR do annotation é o Alex Buckley da Sun MicroSystems.
Annotation são metadados e possui a característica de anotar elementos em Java para adicionar comportamentos a interfaces, classes, métodos, atributos, enum, parâmetros, construtores e etc, para serem processados de forma especial pelo compilador, IDEs, ferramentas de deploy ou em tempo de execução. Definição pela Wikipedia.
 
Existem annotations muito utilizados quando programamos, por exemplo, @Deprecated, @SuppressWarning, @Override, @Inherited entre outras,  A sintaxe para implementar um annotation é similar a de uma Interface, com uma diferença de um arroba ( @ ) antes da palavra chave interface.
public @interface Vjr { }
 
Quando se vai criar a interface de um annotation é importante definir outros seguintes annotations:
@Retention, que aceita um único valor Enumetation do tipo RetentionPolicy que informa ao compilador em que ponto o annotation é descartado. Possuindo três possíveis valores:
SOURCE: Os annotations serão ignorados pelo compilador.
CLASS: Annotations serão adicionados ao arquivo .class, mas que não é necessário ser guardado na memória da VM em tempo de execução.
RUNTIME: Annotation também é adicionado ao .class pelo compilador e é guardada na memória da VM e podem ser lidos utilizando Reflection.
@Target, aceita um único elemento ElementType indica o tipo de elemento do programa será aplicado o annotation. Podendo ser aplicados a interface, classes(TYPE), atributos(FIELD), métodos(METHOD), parâmetros(PARAMETER), construtores(CONSTRUCTOR), annotations(ANNOTATION_TYPE), pacotes(PACKAGE) e para minha surpresa variáveis locais(LOCAL_VARIABLE). Caso não seja especificado nenhum valor para Target, o annotation poderá ser utilizado em todos os elementos do programa.
 
O annotation é capaz de definir valores default para um atributo caso não seja declarado com a palavra chave default. Um exemplo básico de um annotation:

 

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Vjr {
        String getSiteDefault() default ”www.valdemarjr.net”;
        String getBlogDefault();

}
Nos annotations são declarados os métodos, que podem não possuir parametros, que definem os membros do annotation. Mas quando se definem Annotations existem algumas restrições:
  • Um annotation não pode estender outro annotation.
  • O retorno dos métodos declarados em um annotation tem que ser: String, class, tipo enum, annotation ou um array desses tipos anteriores.
  • Não pode lançar exceções, ter a cláusula throws.
  • Não podem se referenciar ou nem ter referência cíclica.
As vantagens é de evitar duplicação de código, deixar implícito algumas funcionalidades que os desenvolvedores não precisam saber, apenas utilizar. Por exemplo com EJB 3.0 podemos definir interfaces remotas e implementação de EJB remotos com apenas um annotation para cada classe, onde antes era preciso configurar arquivos xml gigantes e confusos para dar manutenção.
 
Muitos desenvolvedores, inclusive eu, nunca desenvolveram seu próprio annotation, mas isso será um assunto para um próximo post.

Um comentário:

João Maria Alcantara disse...

Muito bom, dá para entender... parabéns!

Postar um comentário

Postar um comentário