Anotaciones en Java (Annotations – Metadata)

Avanzado

Java proporciona una característica que le permite incrustar información suplementaria en un archivo fuente. Esta información, llamada anotación (annotation), no cambia las acciones de un programa. Sin embargo, esta información puede ser utilizada por varias herramientas, tanto durante el desarrollo como durante el despliegue.

Por ejemplo, una anotación puede ser procesada por un generador de código fuente, por el compilador o por una herramienta de despliegue. El término metadata (metadatos) también se usa para referirse a esta característica, pero el término anotación es el más descriptivo y más utilizado.

La anotación es un tema amplio y sofisticado, y poco a poco trataré de cubrirlo en detalle. Sin embargo, aquí se ofrece una descripción general para familiarizarse con el concepto.

  • Las anotaciones de Java comienzan con ‘@’.
  • Las anotaciones Java no cambian la actividad de un programa ordenado.
  • Ayudan a relacionar metadatos (datos) con los componentes del programa, es decir, constructores, estrategias, clases, etc.
  • Las anotaciones en Java no son comentarios sin adulteraciones, ya que pueden cambiar la forma en que el compilador trata el programa.

1. Creación de un anotación

Una anotación se crea a través de un mecanismo basado en la interfaz. Aquí hay un ejemplo simple:

@interface MiAnotacion{
        String str();
        int val();
  }

Esto declara una anotación llamada MiAnotacion. Observe el @ que precede a la palabra clave interface. Esto le dice al compilador que se está declarando un tipo de anotación. A continuación, observe los dos miembros str() y val(). Todas las anotaciones consisten únicamente en declaraciones de métodos. Sin embargo, no proporciona cuerpos para estos métodos. En cambio, Java implementa estos métodos. Además, los métodos actúan de manera similar a los campos.

Todos los tipos de anotación extienden automáticamente la interfaz Annotation. Por lo tanto, Annotation es una superinterfaz de todas las anotaciones. Se declara dentro del paquete java.lang.annotation.

Originalmente, las anotaciones se usaban para anotar solo declaraciones. En este uso, cualquier tipo de declaración puede tener una anotación asociada. Por ejemplo, clases, métodos, campos, parámetros y constantes enum pueden ser anotados. Incluso una anotación puede ser anotada. En tales casos, la anotación precede al resto de la declaración. A partir de JDK 8, también puede anotar un tipo de uso, como un cast o un tipo de retorno de método.

2. Anotaciones a métodos

Cuando aplica una anotación, le da valores a sus miembros. Por ejemplo, aquí hay un ejemplo de MiAnotacion aplicado a un método:

//Anota un método.
@MiAnotacion(str = "Ejemplo de anotación",val = 28)
public static void miMetodo() {}

Esta anotación está vinculada con el método miMetodo(). Mire de cerca la sintaxis de la anotación. El nombre de la anotación, precedido por un @, va seguido de una lista entre paréntesis de inicializaciones de miembros. Para darle un valor a un miembro, se le asigna un valor al miembro. Por lo tanto, en el ejemplo, la cadena o string “Ejemplo de anotación” se asigna al miembro str de MiAnotacion. Observe que ningún paréntesis sigue a str en esta tarea. Cuando a un miembro de anotación se le asigna un valor, solo se usa su nombre. Por lo tanto, los miembros de anotación parecen campos en este contexto.

Las anotaciones que no tienen parámetros se llaman anotaciones marcador. Estos se especifican sin pasar ningún argumento y sin usar paréntesis. Su único propósito es marcar un elemento con algún atributo.

3. Anotaciones de Java predefinidas/estándar

Java define muchas anotaciones incorporadas. La mayoría son especializadas, pero nueve son de propósito general.

  • Cuatro importados de java.lang.annotation: @Retention, @Documented, @Target, y @Inherited
  • Y cinco de java.lang: @Override, @Deprecated, @SafeVarargs, @FunctionalInterface, y @SuppressWarnings.
Tabla de anotaciones incorporadas en Java de propósito general.
AnotaciónDescripción
@RetentionEspecifica la política de retención que se asociará con la anotación. La política de retención determina el tiempo que una anotación está presente durante el proceso de compilación e despliegue.
@DocumentedUna anotación de marcador que indica a una herramienta que se debe documentar una anotación. Está diseñado para ser utilizado sólo como una anotación en una declaración de anotación.
@TargetEspecifica los tipos de elementos a los que se puede aplicar una anotación. Está diseñado para usarse solo como una anotación en otra anotación. @Target toma un argumento, que debe ser una constante o array de constantes de la enumeración ElementType, que define varias constantes, como CONSTRUCTOR, FIELD y METHOD. El argumento determina los tipos de elementos a los que se puede aplicar la anotación. Si @Target no está especificado, la anotación se puede usar en cualquier declaración.
@InheritedUna anotación de marcador que hace que la anotación de una superclase sea heredada por una subclase.
@OverrideUn método anotado con @Override debe anular un método de una superclase. Si no lo hace, se producirá un error en tiempo de compilación. Se utiliza para asegurar que un método de superclase esté anulado, y no simplemente sobrecargado. Esta es una anotación de marcador
@DeprecatedUna anotación que indica que un elemento está obsoleto y no se recomienda su uso. A partir de JDK 9, @Deprecated se ha mejorado para permitir que se especifique la versión de Java en la que se produjo la obsolescencia y si el elemento obsoleto va a ser eliminado.
@SafeVarargsUna anotación de marcador que indica que no se producen acciones inseguras relacionadas con un parámetro varargs en un método o constructor. Puede ser aplicado a métodos y constructores, con varias restricciones.
@FunctionalInterfaceEspecifica que se deben suprimir una o más advertencias que pueda emitir el compilador. Las advertencias a suprimir se especifican por nombre, en forma de strirg.
@SuppressWarningsUna anotación de marcador que se utiliza para anotar una declaración de interfaz. Indica que la interfaz anotada es una interfaz funcional, que es una interfaz que contiene un único método abstracto. Los interfaces funcionales son utilizados por las expresiones lambda. Es importante entender que @Functionallntertace es puramente informativo. Cualquier interface con exactamente un método abstracto es, por definición, una interfaz funcional.

@Repeatable y @Native. @Repeatable admite anotaciones repetibles, que son anotaciones que se pueden aplicar más de una vez a un solo elemento. @Native se utiliza para anotar un campo constante al que se accede mediante código ejecutable (es decir, nativo).

4. Ejemplo con @Deprecated

Aquí hay un ejemplo que usa @Deprecated para marcar la clase MiClase y el método getMsg(). Cuando intente compilar este programa, las advertencias informarán el uso de estos elementos obsoletos (deprecated).

//Un ejemplo del uso de @Deprecated

//Desestimar una clase
@Deprecated
class MiClase{
    private String msg;

    MiClase(String m){
        msg=m;
    }

    //Desestimar un método dentro de una clase.
    @Deprecated
    String getMsg(){
        return msg;
    }
    //...
}

class Anotaciones {
    public static void main(String[] args) {
        MiClase miObjeto=new MiClase("prueba");
        System.out.println(miObjeto.getMsg());
    }
}

Como punto de interés, a lo largo de los años, varios elementos en la biblioteca de API de Java han sido obsoletos, y pueden ocurrir deprecaciones adicionales a medida que Java continúa evolucionando. Recuerde, aunque los elementos de la API en desuso todavía están disponibles, no se recomienda su uso. Normalmente, se ofrece una alternativa al elemento API obsoleto.

Anotaciones en Java
  • Introducción a Anotaciones

Sobre el Autor:

Hey hola! Yo soy Alex Walton y tengo el placer de compartir conocimientos hacía ti sobre el tema de Programación en Java, desde cero, Online y Gratis.

Deja una Respuesta

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.