Groovy - Annotazioni

Le annotazioni sono una forma di metadati in cui forniscono dati su un programma che non fa parte del programma stesso. Le annotazioni non hanno alcun effetto diretto sul funzionamento del codice che annotano.

Le annotazioni vengono utilizzate principalmente per i seguenti motivi:

  • Information for the compiler - Le annotazioni possono essere utilizzate dal compilatore per rilevare errori o sopprimere gli avvisi.

  • Compile-time and deployment-time processing - Gli strumenti software possono elaborare le informazioni di annotazione per generare codice, file XML e così via.

  • Runtime processing - Alcune annotazioni sono disponibili per essere esaminate in fase di esecuzione.

In Groovy, un'annotazione di base appare come segue:

@interface - Il carattere at sign (@) indica al compilatore che ciò che segue è un'annotazione.

Un'annotazione può definire membri in the form di metodi senza corpi e un valore predefinito opzionale.

Le annotazioni possono essere applicate ai seguenti tipi:

Tipo di stringa

Di seguito viene fornito un esempio di annotazione per una stringa:

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

Tipo di enumerazione

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

Tipo di classe

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

Valori dei membri dell'annotazione

Quando viene utilizzata un'annotazione, è necessario impostare almeno tutti i membri che non hanno un valore predefinito. Un esempio è dato seguito. Quando l'annotazione Esempio viene utilizzata dopo essere stata definita, deve essere assegnato un valore.

@interface Example {
   int status() 
}

@Example(status = 1)

Parametri di annotazione di chiusura

Una buona caratteristica delle annotazioni in Groovy è che puoi usare una chiusura anche come valore di annotazione. Pertanto le annotazioni possono essere utilizzate con un'ampia varietà di espressioni.

Di seguito viene fornito un esempio su questo. L'annotazione Onlyif viene creata in base a un valore di classe. Quindi l'annotazione viene applicata a due metodi che inviano messaggi diversi alla variabile di risultato in base al valore della variabile numerica.

@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 annotazioni

Questa è una caratteristica abbastanza utile delle annotazioni in groovy. Potrebbero arrivare momenti in cui potresti avere più annotazioni per un metodo come quello mostrato di seguito. A volte può diventare complicato avere più annotazioni.

@Procedure 
@Master class 
MyMasterProcedure {}

In tal caso è possibile definire una meta-annotazione che raggruppa più annotazioni insieme e applicare la meta annotazione al metodo. Quindi, per l'esempio precedente, puoi definire per prima cosa la raccolta di annotazioni utilizzando AnnotationCollector.

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

Fatto ciò, puoi applicare il seguente meta-annotatore al metodo:

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