|
J2SE 5 mette a disposizione sei Annotations predefinite, ma prima di passare alle loro definizioni e descrizioni vediamo in breve la sintassi di definizione di una annotation. La definizione di una annotation avviene in modo simile alla definizione di un’interfaccia, con le seguenti differenze: Si usa la parola chiave @interface anzichè interface La clausola extends non è ammessa I “metodi” non hanno alcun parametro e possono ritornare solo tipi primitivi, String, Class, tipi enum e array dei tipi appena elencati.
Esistono anche altre limitazioni; per chi volesse approfondire maggiormente la sintassi di definizione può riferirsi alle specifiche ufficiali Passiamo, adesso, alle Annotations predefinite. Una cosa interessante da notare è come le definizioni delle annotations siano a loro volta decorate con annotazioni!! Abbiamo quindi delle meta-annotazioni, in particolare queste sono: @Documented, @Target e @Retention.
java.lang.Overrides @Target(ElementType.METHOD) public @interface Overrides { } Questa annotation è usata per indicare che una dichiarazione di un metodo di una classe vuole fare l’override dello stesso metodo presente nella sua diretta o indiretta superclasse. Se un metodo viene decorato con questa annotation ma non sovrascrive il metodo della superclasse, viene dato un errore a tempo di compilazione, ma vediamo un esempio per chiarire meglio la cosa: class Pippo { @Overrides public String toString(int i) { return ""; } } Quando questa classe viene compilata, viene dato il seguente messaggio di errore: method does not override a method from its superclass @Overrides ^ Questo avviene perchè l’annotation dichiara che si intende fare l’override del metodo toString() di Object e invece non viene fatto, in quanto la signature del metodo toString non prevede parametri di input. Per ovviare all’errore basta riscrivere il metodo senza alcun argomento in input. L’utilizzo di questa annotation permette un maggiore controllo sul codice quando magari si crede di aver fatto un ovverride e invece si è scritto un metodo nuovo. java.lang.annotation.Documented @Documented @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { } Documented indica che l’annotation a cui essa è applicata deve essere documentata. Annotation di questo tipo, senza alcun campo, vengono chiamate Marker Annotation. java.lang.annotation.Deprecated @Documented @Retention(RetentionPolicy.SOURCE) public @interface Deprecated { } Questa annotation indica al compilatore java di avvertire a tempo di compilazione, l’utente che utilizza classi, metodi o campi, decorati con questa annotation. E’ in pratica un metodo per segnalare classi o metodi “depreceted”, cioè metodi che sono stati riscritti o sostituiti da altri metodi “migliori” e il cui uso è quindi sconsigliato. java.lang.annotation.Inherited @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Inherited { } Decorare una annotation che chiameremo A, con Inherited vuol dire che tutte le sottoclassi di una classe decorata con A, erediterà automaticamente la annotation A. java.lang.annotation.Retention @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); } Questa annotation prende in input un singolo valore che definisce la “visibilità” delle annotations a cui è applicato, cioè dove queste si rendono disponibili e possono essere lette ed usate. I valori validi per il parametro in input sono elencati nella enumeration java.lang.annotation.RetentionPolicy e sono i seguenti: RetentionPolicy.SOURCE: L’annotation decorata è visibile a livello di codice sorgente. RetentionPolicy.CLASS: L’annotation decorata è visibile a livello di codice sorgente e nelle classi compilate RetentionPolicy.RUNTIME: L’annotation decorata è visibile a livello di codice sorgente, nelle classi compilate ed è possibile caricarle nella JVM a tempo di esecuzione
Di default tutte le annotations sono visibili a livello di codice sorgente. java.lang.annotation.Target @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); } Questa annotation viene usata per indicare il tipo di elemento di programma (classe, metodo o campo) a cui l’annotation può essere applicata. Se Target non è presente in una annotation vuol dire che quest’ultima può essere usata in qualsiasi elemento di programma. I valori validi per il parametro di input sono elencati nella enumeration java.lang.annotation.ElementType e sono i seguenti:
TYPE : L’ annotation si applica a classi, interfacce (incluso il tipo annotation) e dichiarazioni di enum FIELD: L’annotation si applica alle dichiarazioni di campi METHOD: L’annotation si applica alle dichiarazioni di metodi PARAMETER: L’annotation si applica alle dichiarazioni di parametri CONSTRUCTOR: L’annotation si applica alle dichiarazioni di costruttori LOCAL_VARIABLE: L’annotation si applica alle dichiarazioni di variabili locali ANNOTATION_TYPE: L’annotation si applica alle dichiarazioni di annotazioni PACKAGE: L’annotation si applica alle dichiarazioni di package
|