Groovy - Anotaciones

Las anotaciones son una forma de metadatos en la que proporcionan datos sobre un programa que no forma parte del programa en sí. Las anotaciones no tienen ningún efecto directo sobre el funcionamiento del código que anotan.

Las anotaciones se utilizan principalmente por las siguientes razones:

  • Information for the compiler - El compilador puede utilizar las anotaciones para detectar errores o suprimir advertencias.

  • Compile-time and deployment-time processing - Las herramientas de software pueden procesar información de anotaciones para generar código, archivos XML, etc.

  • Runtime processing - Algunas anotaciones están disponibles para ser examinadas en tiempo de ejecución.

En Groovy, una anotación básica tiene el siguiente aspecto:

@interface: el carácter de signo arroba (@) indica al compilador que lo que sigue es una anotación.

Una anotación puede definir miembros en the form de métodos sin cuerpos y un valor predeterminado opcional.

Las anotaciones se pueden aplicar a los siguientes tipos:

Tipo de cadena

A continuación se muestra un ejemplo de una anotación para una cadena:

@interface Simple { 
   String str1() default "HelloWorld"; 
}

Tipo de enumeración

enum DayOfWeek { mon, tue, wed, thu, fri, sat, sun } 
@interface Scheduled {
   DayOfWeek dayOfWeek() 
}

Tipo de clase

@interface Simple {} 
@Simple 
class User {
   String username
   int age
}
 
def user = new User(username: "Joe",age:1); 
println(user.age); 
println(user.username);

Valores de miembros de anotación

Cuando se usa una anotación, es necesario establecer al menos todos los miembros que no tienen un valor predeterminado. A continuación se ofrece un ejemplo. Cuando se usa el Ejemplo de anotación después de haber sido definido, debe tener un valor asignado.

@interface Example {
   int status() 
}

@Example(status = 1)

Parámetros de anotación de cierre

Una buena característica de las anotaciones en Groovy es que también puede utilizar un cierre como valor de anotación. Por lo tanto, las anotaciones se pueden utilizar con una amplia variedad de expresiones.

A continuación se ofrece un ejemplo sobre esto. La anotación Onlyif se crea basándose en un valor de clase. Luego, la anotación se aplica a dos métodos que publican mensajes diferentes en la variable de resultado según el valor de la variable de número.

@interface OnlyIf {
   Class value() 
}  

@OnlyIf({ number<=6 }) 
void Version6() {
   result << 'Number greater than 6' 
} 

@OnlyIf({ number>=6 }) 
void Version7() {
   result << 'Number greater than 6' 
}

Meta anotaciones

Esta es una característica bastante útil de las anotaciones en groovy. Puede haber ocasiones en las que tenga varias anotaciones para un método como el que se muestra a continuación. A veces, esto puede resultar complicado al tener varias anotaciones.

@Procedure 
@Master class 
MyMasterProcedure {}

En tal caso, puede definir una meta-anotación que agrupa varias anotaciones y aplicar la meta-anotación al método. Entonces, para el ejemplo anterior, puede definir primero la colección de anotaciones usando AnnotationCollector.

import groovy.transform.AnnotationCollector
  
@Procedure 
@Master 
@AnnotationCollector

Una vez hecho esto, puede aplicar el siguiente metaanotador al método:

import groovy.transform.AnnotationCollector
  
@Procedure 
@Master 
@AnnotationCollector
  
@MasterProcedure 
class MyMasterProcedure {}