2014-10-09 17 views
9

Durante la lettura sulle interfacce Marker sono incappato il seguente sito: Item 37: Use marker interfaces to define types
qui, secondo Joshua Bloch ci sono due vantaggi di interfacce Marker oltre le annotazioni Marker.Marker annotazione vs Marker interfaccia

  1. interfacce Marker definiscono un tipo che viene implementato da istanze classe marcata; le annotazioni dei marcatori no. L'esistenza di questo tipo di consente di rilevare gli errori in fase di compilazione che non è possibile acquisire fino al runtime se si utilizza un'annotazione marcatore.

  2. Un altro vantaggio delle interfacce marcatore rispetto alle annotazioni dei marker è che possono essere targetizzati in modo più preciso. Se un tipo di annotazione è dichiarato con la destinazione ElementType.TYPE, può essere applicato a qualsiasi classe o interfaccia . Supponiamo che tu abbia un indicatore applicabile solo alle implementazioni di una particolare interfaccia. Se lo si definisce come interfaccia marker, è possibile estendere l'interfaccia unica a che è applicabile, garantendo che tutti i tipi contrassegnati siano anche sottotipi dell'interfaccia unica a cui è applicabile.

OK, Primo punto è capito, ma non sono sicuro se ho ben capito il 2 ° punto in modo corretto:

Se un tipo di annotazione viene dichiarata con l'obiettivo ElementType.TYPE, può essere applicato a qualsiasi classe o interfaccia

Allo stesso modo, se si dispone di un'interfaccia marker, anche quella può essere applicata a qualsiasi classe o interfaccia. Non sta dicendo la stessa cosa sulle annotazioni dei marker e sulle interfacce dei marker? Come può essere mirata in modo più preciso un'interfaccia marcatore?

Il 2 ° punto menziona anche che:

si può avere [il marcatore Interface] estendere l'unica interfaccia a cui è applicabile, garantendo che tutti i tipi marcati sono anche sottotipi della suola interfaccia a cui è applicabile.

Non potete anche raggiungere questo obiettivo con le annotazioni, utilizzando il @Inherited meta-annotazione?

+0

Ho modificato la domanda per renderla un po 'più facile da capire. Se cambio troppo, puoi ovviamente cambiarlo. – Kapep

risposta

7

Come può essere mirata in modo più preciso un'interfaccia marker?

Si è corretto che entrambi potrebbero essere applicati a qualsiasi tipo. Con "mirato più precisamente" l'autore significa che è possibile aggiungere ulteriori restrizioni a quali tipi specifici è possibile applicare un'interfaccia marcatore. Non è possibile aggiungere le stesse restrizioni precise alle annotazioni: se un'annotazione è limitata a ElementType.TYPE, può sempre essere applicata a tutti i tipi.

L'altra parte del secondo punto fornisce dettagli su come aggiungere tali restrizioni. Se si dispone di un'interfaccia marcatore, si può lasciare che si estende un'altra interfaccia (che l'autore chiama la unica interfaccia) come questo:

interface Marker extends Foo { } 

Il marcatore può ora essere applicato solo ai tipi che implementano Foo.

Non potete anche raggiungere questo obiettivo con le annotazioni, utilizzando il @Inherited meta-annotazione?

No, il @Inherited meta-annotazione significa solo che qualsiasi sottotipo di una classe annotata verrà trattata come se avesse anche la stessa annotazione. Non impone alcuna restrizione a quali tipi l'annotazione può essere applicata.

+1

La tua risposta ha avuto un senso .. Grazie per la spiegazione .. – Mac

+0

Non ho potuto capire questa discussione - sia la domanda che la risposta ... –

+0

@kapep: L'autore - Joshua Bloch sta cercando di dire che le annotazioni non possono essere ereditate ? –