Annotazioni Java


114

Qual è lo scopo delle annotazioni in Java? Ho questa idea confusa di loro come una via di mezzo tra un commento e il codice effettivo. Influenzano il programma in fase di esecuzione?

Quali sono i loro usi tipici?

Sono unici per Java? Esiste un equivalente in C ++?


9
Puoi fare cose davvero malvagie con le annotazioni. Ad esempio, se conosci Spring Framework e la loro annotazione @Transactional che avvia una transazione prima dell'invocazione del metodo e esegue il rollback in caso di eccezione / errore e si impegna in caso di transazione riuscita. Supporta totalmente il principio SOC (separazione delle preoccupazioni). Molto pulito ! Regole Java! :-)

1
Mi sembrano 3 domande. Il secondo in sé è troppo ampio.
Raedwald

Tutte le annotazioni per sintassi sembrano interfacce. Quindi, come il compilatore o la JVM conosce il suo scopo? Supponiamo che se prendiamo @ Override -> esegue un controllo per verificare se il metodo è stato sostituito correttamente o meno @ Transactional, come spiegato sopra, esegue cose relative alla transazione. Per tutte queste annotazioni, dove possiamo trovare definizione / logica?
Paramesh Korrakuti

Risposte:


80

Le annotazioni vengono utilizzate principalmente dal codice che esamina altro codice. Sono spesso usati per modificare (cioè decorare o incartare) classi esistenti in fase di esecuzione per cambiare il loro comportamento. Framework come JUnit e Hibernate utilizzano annotazioni per ridurre al minimo la quantità di codice che è necessario scrivere da soli per utilizzare i framework.

Oracle ha una buona spiegazione del concetto e del suo significato in Java sul loro sito.


17

Inoltre, sono unici per Java, esiste un equivalente C ++?

No, ma VB e C # hanno attributi che sono la stessa cosa.

Il loro uso è abbastanza vario. Un tipico esempio Java @Overridenon ha alcun effetto sul codice ma può essere utilizzato dal compilatore per generare un avviso (o un errore) se il metodo decorato non ha effettivamente la precedenza su un altro metodo. Allo stesso modo, i metodi possono essere contrassegnati come obsoleti.

Poi c'è la riflessione. Quando rifletti un tipo di classe nel tuo codice, puoi accedere agli attributi e agire in base alle informazioni che si trovano lì. Non conosco esempi in Java, ma in .NET questo viene utilizzato dal compilatore per generare (de) informazioni di serializzazione per le classi, determinare il layout di memoria delle strutture e dichiarare le importazioni di funzioni dalle librerie legacy (tra le altre). Controllano anche il funzionamento del progettista di moduli IDE.

/ EDIT: gli attributi sulle classi sono paragonabili alle interfacce dei tag (come Serializable in Java). Tuttavia, le linee guida per la codifica .NET dicono di non usare interfacce di tag. Inoltre, funzionano solo a livello di classe, non a livello di metodo.


13

Anders fornisce un buon riepilogo ed ecco un esempio di un'annotazione JUnit

@Test(expected=IOException.class)
public void flatfileMissing() throws IOException {
    readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat");
}

Qui l' @Testannotazione dice a JUnit che il flatfileMissingmetodo è un test che dovrebbe essere eseguito e che il risultato atteso è un lancio IOException. Pertanto, quando esegui i tuoi test, questo metodo verrà chiamato e il test passerà o fallirà a seconda che IOExceptionvenga lanciato un.


7

Java ha anche l'Annotation Processing Tool (apt) in cui non solo crei annotazioni, ma decidi anche come queste annotazioni funzionano sul codice sorgente.

Ecco un'introduzione.



1

Per definizione letterale un'annotazione aggiunge note a un elemento. Allo stesso modo, le annotazioni Java sono tag che inseriamo nel codice sorgente per fornire maggiori informazioni sul codice. Le annotazioni Java associano le informazioni all'elemento del programma annotato. Oltre alle annotazioni Java, i programmi Java hanno abbondanti quantità di documentazione informale che di solito è contenuta nei commenti nel file del codice sorgente. Tuttavia, le annotazioni Java sono diverse dai commenti: annotano direttamente gli elementi del programma utilizzando i tipi di annotazione per descrivere la forma delle annotazioni. Le annotazioni Java presentano le informazioni in modo standard e strutturato in modo che possano essere utilizzate facilmente dagli strumenti di elaborazione.

Per leggere in dettaglio, c'è un bel tutorial sulle annotazioni Java



0

Le annotazioni quando si tratta di EJB sono note come la scelta di un approccio middleware implicito rispetto a un approccio middleware esplicito, quando si utilizza l'annotazione si personalizza ciò di cui si ha esattamente bisogno dall'API, ad esempio è necessario chiamare il metodo di transazione per un bonifico bancario : senza utilizzare l'annotazione: il codice sarà

transfer(Account account1, Account account2, long amount)    
{
   // 1: Call middleware API to perform a security check
   // 2: Call middleware API to start a transaction
   // 3: Call middleware API to load rows from the database
   // 4: Subtract the balance from one account, add to the other
   // 5: Call middleware API to store rows in the database
   // 6: Call middleware API to end the transaction
}

mentre si utilizza Annotation, il codice non contiene chiamate API ingombranti per utilizzare i servizi middleware. Il codice è pulito e focalizzato sulla logica aziendale

transfer(Account account1, Account account2, long amount) 
{
   // 1: Subtract the balance from one account, add to the other
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.