Introducción
Las anotaciones son una característica de java que aparecen a partir del JDK 5 y nos proveen de información acerca del código fuente y no necesariamente tienen efecto en este. Un ejemplo claro de anotaciones esta en los nuevos frameworks de java como por ejemplo Hibernate, JPA, entre otros.Para entender de una manera mejor el uso de las anotaciones, explicaré dos anotaciones que se utilizan comúnmente en Java: @Deprecated y @Override
La primera @Deprecated se utiliza para indicar que un método se encuentra obsoleto, es decir que ha sido reemplazado por otro mas actual o simplemente ya no tiene soporte y @Override en cambio indica que un método heredado será reemplazado por otro.
Este es un ejemplo de la información que se tiene sobre un método y claramente esto no interfiere en la ejecución o la lógica del mismo.
Los casos anteriores son ejemplos básicos, ya que las anotaciones pueden guardar cuanta información se desee, esto se explicará en la siguiente parte.
Definiendo Anotaciones Propias
Primero partamos de la forma de definir una anotación (el siguiente es el código fuente de la definición de la anotación java.lang.Override):
package java.lang;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
Analicemos los elementos particulares en este caso.
- @interface: es la clave para indicar que este archivo ".java" será la definición de una anotación.
- @target: especifica en que lugar se puede utilizar esta anotación:
- ANNOTATION_TYPE: solo pueden utilizarse en la definición de anotaciones por ejemplo: @Target y @Retention son de este tipo.
- CONSTRUCTOR: en los constructores de una clase.
- FIELD: para los atributos privados o públicos de una clase.
- LOCAL_VARIABLE: para las variables declaradas dentro de métodos.
- METHOD: para métodos de una clase.
- PACKAGE: para archivos de definición del paquetes.
- PARAMETER: para parámetros de funciones.
- TYPE: para las clases, similar a ANNOTATION_TYPE pero aplicable a objetos o clases en general.
- @Retention: especifica cuanto se retendrá la anotación, sus casos son:
- SOURCE: indica que la anotación solo permanecerá en el código fuente, al momento de compilar desaparecerá por así decir. de manera que no es escrita en el ".class"(bytecode).
- CLASS: se incluye en el momento de compilar, pero se descartan al momento de cargar la clase (ejecutar). Este es el comportamiento por defecto.
- RUNTIME: no se descarta la anotación, estará disponible para Reflexión en la ejecución. El tema de Reflexión se lo abordará adelante.
- Override: es simplemente el nombre de la anotación.
Como indique en la introducción @Override es un caso de una anotación sencilla. Pero las anotaciones pueden servirnos para guardar información adicional.
Por ejemplo si desearíamos crear una anotación que sirva para guardar información del autor e IDE de una clase, podría ser:
package eblug;
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassInfo {
String autor();
String comentario() default "";
int version() default 1;
IdeEnum ide() default IdeEnum.NETBEANS;
}
public enum IdeEnum {
NETBEANS,
ECLIPSE
}
Ojo que no todos los tipos pueden ser utilizados en las Anotaciones
Para utilizar simplemente se agrega a la definición de la clase de la siguientes formas:
@ClassInfo(autor = "eblug")
public class ClaseEjemplo{
}
//----------------------------------------
@ClassInfo(autor = "eblug", comentario = "un comentario")
public class ClaseEjemplo{
}
//----------------------------------------
@ClassInfo(autor = "eblug", ide = IdeEnum.ECLIPSE, version = 2)
public class ClaseEjemplo{
}
Como se aprecia anteriormente el autor es obligatorio en la anotación porque no tiene la definición de default a diferencia de comentario, version e IDE.
Una particularidad de las anotaciones es cuando se tiene un solo atributo y este lleva el nombre de "value" la utilización puede ser la siguiente:
package eblug;
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassInfo {
IdeEnum value();
}
public enum IdeEnum {
NETBEANS,
ECLIPSE
}
En este caso la utilización puede ser así:
@ClassInfo(IdeEnum.ECLIPSE)
public class ClaseEjemplo{
}
No hay comentarios:
Publicar un comentario