2011-09-03 13 views
7

Ho usato annotazioni in Java o un po 'come utente finale ma di recente ho deciso di cercare i miei tipi di annotazione personali e trovo la sintassi per la definizione di annotazioni in Java con @interface molto strana. La mia domanda è: perché Java usa @interface per definire le annotazioni invece di introdurre una nuova parola chiave come hanno fatto per l'enumerazione? C'è qualche vantaggio della sintassi @interface che mi manca?Perché @interface viene utilizzato per definire le annotazioni?

Mi sto connettendo all'idea di introdurre una nuova parola chiave per definire le annotazioni.

@interface ha troppe restrizioni, ad esempio non è possibile utilizzare ext, ci sono tipi specifici che non è possibile utilizzare quando si definisce un membro di annotazione come Date. Trovo che le restrizioni su cosa possa essere inserito in @interface non siano ovvie e mi sembra una sorta di compromesso.

risposta

0

Chiaramente i progettisti non hanno voluto aggiungere una parola chiave. Non qualcosa che fai alla leggera, in quanto invalida i programmi corretti esistenti. Il comitato Cobol-9x ha aggiunto dozzine se non centinaia di parole chiave e dovresti aver sentito le urla. Alcune società stavano parlando di denunciare il corpo degli standard.

+0

Puoi per favore approfondire cosa intendi @ non è una parola chiave il compilatore lo tratta in un modo speciale mentre la specifica dice che puoi definire il tipo di annotazione con qualcosa come "@interfaccia" con spazi tra l'interfaccia @ per me mi sembra una parola chiave vedere la mia domanda aggiornata come "perché no" non è l'unica risposta disponibile – ams

+0

@ams mi scuso, ho controllato la grammatica Java, è davvero una parola chiave quindi ho completamente rivisto la mia risposta. – EJP

5

non so le considerazioni esatte per questo caso particolare, ma in generale:

L'introduzione di una nuova parola chiave in una compatibilità rompe la lingua di tutto il codice sorgente esistente che succede a utilizzare quella determinata parola chiave come un identificatore.

Il codice sorgente esistente non può essere compilato con la nuova versione del compilatore finché non è stato modificato per evitare la parola chiave. Questo non è impossibile da superare (come dimostrato dal caso enum), ma è difficile e costringe molte persone a svolgere un lavoro extra. I progettisti di Java hanno generalmente cercato di introdurre nuove funzionalità linguistiche senza rompere la compatibilità del codice sorgente.

Nel caso di enum, che hai menzionato, credo che abbiano deciso che è (a) una parola chiave comune in altri linguaggi in stile C, (b) generalmente utilizzato solo come identificatore di ambito locale nel codice esistente e quindi facilmente refactored e (c) senza alternative sane. Decisero che i benefici superassero i costi. Per il caso di annotazione, apparentemente hanno deciso diversamente.

Per inciso, potresti essere interessato a guardare Josh Bloch's Effective API Design talk che tocca molte di queste considerazioni.

1

Le dichiarazioni di annotazione sono generalmente molto disgustose da guardare.

Probabilmente pensavano che solo pochi (esperti) dichiareranno ed elaboreranno annotazioni, la maggior parte dei programmatori utilizzerà semplicemente annotazioni progettate da esperti. Quindi non pensavano troppo per abbellire le dichiarazioni di annotazione. enum dovrebbe essere usato dalla maggior parte dei programmatori nel loro lavoro quotidiano, quindi la sintassi deve essere succinta.

Ma ora sempre più framework come Guice/CDI richiedono/incoraggiano i programmatori di app a dichiarare le proprie annotazioni. E molti programmatori si sentono abbastanza coraggiosi da progettare ed elaborare le proprie annotazioni. Il problema della sintassi disordinata delle dichiarazioni di annotazione diventa più evidente.

+0

concordato JSR 303 Bean Validation richiede che gli sviluppatori definiscano le proprie annotazioni se si desidera fare annotazioni di validatore composito data la centralità della convalida per creare applicazioni Penso che il commento che ho visto nelle specifiche Sun che la maggior parte degli sviluppatori dovrà solo usare ma non definire le annotazioni per essere miope. – ams

Problemi correlati