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 {}