Tu primera Annotation chispas (I)

Todo el dia usando las annotations de JPA/Hibernate3 y aun no sabes muy bien de que va?
Como funciona? Como crear tu propia annotation?

La verdad es que crear una annotation es bastante trivial. Quizas el quid de la cuestion sea mas bien, como usar nuestras annotations, como hacer que sean usables.

Como no podria ser de otra manera voy a intentar explicarlo usando ejemplos absurdos. Vale, pongamos que tenemos un VO (value object), que contiene informacion sobre una serie de bares, con sus getters y setters. Digamos que contiene una puntuacion de esos bares. Imaginemos que existe una prestigiosa guia de bares que puntua esos bares. Esa guia se llama Foo -no la conoceis?- y nos mola indicar que bares han sido puntuados por Foo, para eso vamos a usar annotations. Ya he dicho que el ejemplo es absurdo. Muy absurdo.

Empezamos declarando la annotation:


package test.absurdo.annotation.chorranotacion;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
/**
 * @author dbejar
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Foo {
	String alias() default "Foola";
}

Usamos @interface para definir nuestra annotation.
Con @Retention le indicamos la politica de rentencion, RUNTIME significa que la annotation estará disponible en tiempo de ejecucion, de tal forma que podamos usarla por reflection.
Con @Target le indicamos el lugar en el que deben colocarse estas annotations, asi METHOD le indica que esta es una annotation que ira en metodos, no en propiedades. Me llama la atencion la posibilidad de especificar ANNOTATION_TYPE que nos brindaria la posibilidad de añadir mas caracteristicas a nuestra proxima annotation.
Podeis investigar solitos las distintas combinaciones y posibilidades para definir una annotation.

También le hemos añadido un atributo, alias, que sera un String, cuyo valor por defecto es «Foola». He hecho esto para explicar como añadirle atributos a nuestras annotations caseras. El valor por defecto es opcional, podemos perfectamente añadir atributos sin ningún valor por defecto.

Vale, ya tenemos la annotation declarada. Ahora vamos a usarla en nuestro VO.


package test.absurdo.vo;

import test.absurdo.annotation.chorranotacion.Foo;

public class AbsurdoVO{
	private int bar0;
	private int bar1;
	private int bar2;
	private int bar3;
	private int bar4;
	private int bar5;
	private int bar6;
	private int bar7;
	private int bar8;
	private int bar9;
	public AbsurdoVO(){
		setBar0(0);
		setBar1(1);
		setBar2(2);
		setBar3(3);
		setBar4(4);
		setBar5(5);
		setBar6(6);
		setBar7(7);
		setBar8(8);
		setBar9(9);
	}
	@Foo(alias="Bar de tapas")
	public int getBar0() {
		return bar0;
	}
	public void setBar0(int bar0) {
		this.bar0 = bar0;
	}
	public int getBar1() {
		return bar1;
	}
	public void setBar1(int bar1) {
		this.bar1 = bar1;
	}
	@Foo(alias="Bar de copas")
	public int getBar2() {
		return bar2;
	}
	public void setBar2(int bar2) {
		this.bar2 = bar2;
	}
	public int getBar3() {
		return bar3;
	}
	public void setBar3(int bar3) {
		this.bar3 = bar3;
	}
	public int getBar4() {
		return bar4;
	}
	public void setBar4(int bar4) {
		this.bar4 = bar4;
	}
	@Foo(alias="Bar que te clavan")
	public int getBar5() {
		return bar5;
	}
	public void setBar5(int bar5) {
		this.bar5 = bar5;
	}
	public int getBar6() {
		return bar6;
	}
	public void setBar6(int bar6) {
		this.bar6 = bar6;
	}
	public int getBar7() {
		return bar7;
	}
	public void setBar7(int bar7) {
		this.bar7 = bar7;
	}
	@Foo
	public int getBar8() {
		return bar8;
	}
	public void setBar8(int bar8) {
		this.bar8 = bar8;
	}
	public int getBar9() {
		return bar9;
	}
	public void setBar9(int bar9) {
		this.bar9 = bar9;
	}

}

En la segunda parte explicare como sacarle partido en tiempo de ejecución a nuestros métodos anotados con @Foo