2014-09-28 10 views
6

Früher habe ich eine Wrapper Annotation von Hand zu erklären, mit einem Array, und dann rufen Sie wie folgt:Order of automatisch eingewickelt @Repeatable Anmerkungen

@Foos({ @Foo(0), @Foo(1), @Foo(2) }) 
public void bar() {} 

Da ich einen Array mit den { ... } initializers Herstellung wurde Es war mehr als klar, dass die Reihenfolge der Deklaration identisch sein sollte, wenn ich später über Reflection auf diese Methode zugreife.

Wenn ich jedoch die neue @Repeatable Annotation von Java 8 verwende, kann ich garantieren, dass die Bestellung beibehalten wird?

erklärte ich einen einfachen Satz von Anmerkungen:

public @interface Foos { 
    Foo[] value(); 
} 

@Repeatable(Foos.class) 
public @interface Foo { 
int value(); 
} 

und einige Tests mit den unterschiedlichsten Szenarien laufen:

@Foo(0) @Foo(1) @Foo(2) 
public void bar1() {} 

@Foo(2) 
@Deprecated @Foo(5) 
@Foo(10) 
public void bar2() {} 

und alles scheint einwandfrei zu arbeiten (wenn sie über Reflection Zugriff), aber Ich würde mich nicht auf undokumentiertes Zeug verlassen wollen. Es scheint mir offensichtlich, dass dies der Fall sein sollte, aber ich kann es nirgends finden! Kann das jemand beleuchten?

Antwort

9

Hier ist, was die Java Language Specification sagt:

Wenn eine Deklarationskontext oder Typ Kontext mehrere Anmerkungen einer wiederholbaren Annotationstyp T hat, dann ist es, als ob der Kontext Anmerkungen vom Typ T erklärte nicht ausdrücklich hat und eine implizit deklarierte Annotation des umschließenden Annotationstyps von T.

Die implizit deklarierte Annotation heißt die Annotation des Containers, und die im Kontext erscheinenden multiplen Annotationen vom Typ T heißen Basiskommentare. Die Elemente des (array-typed) -Wertelements der Containeranmerkung sind alle Basisanmerkungen in der Reihenfolge von links nach rechts, in der sie im Kontext erschienen sind.

(Hervorhebung von mir)

Also ja, die Reihenfolge der Anmerkungen in der Behälter Anmerkung ist das gleiche wie die Reihenfolge der Deklaration der wiederholbaren Anmerkungen.

+0

Danke! Jetzt fühle ich mich sicher mit diesem :) –

Verwandte Themen