2014-07-10 20 views
10

Ist es möglich, eine Annotation mit einem Null als Standard anzugeben?Annotation default "null" -Wert

Was ich erreichen möchte, ist so etwas wie optionale Anmerkungsattribute.

Zum Beispiel

public @interface Foo { 

    Config value(); 

} 


public @interface Config { 

    boolean ignoreUnknown() default false; 
    int steps() default 2; 
} 

Ich möchte @foo verwenden (ohne den Wert, der angibt, so sollte es eine Art optional sein) und ich möchte auch in der Lage sein mag, so etwas zu schreiben:

@Foo (
    @Config(
     ignoreUnknown = true, 
     steps = 10 
    ) 
) 

Ist es möglich, so etwas mit Anmerkungen zu tun?

Ich will nicht so etwas wie diese öffentlich @interface Foo tun {

boolean ignoreUnknown() default false; 
    int steps() default 2; 
} 

, weil ich, wenn eine Eigenschaft unterscheiden können, will gesetzt wurde oder nicht (und nicht, wenn es hat die Standardwert oder nicht).

Es ist ein wenig kompliziert zu beschreiben, aber ich arbeite an einem kleinen Annotation Processor, der Java-Code generiert. Zur Laufzeit möchte ich jedoch eine Standard-Konfiguration einrichten, die für alle @Foo verwendet werden sollte, ausgenommen diejenigen, die eine eigene Konfiguration mit @Config festgelegt haben.

so was ich will, ist so etwas wie dieses:

public @interface Foo { 

     Config value() default null; 

} 

Aber soweit ich es nicht möglich wissen, nicht wahr? Kennt jemand eine Problemumgehung für solch ein optionales Attribut?

+0

Mögliche Duplikat [Fehler einen Standardnullwert für eine Anmerkung Feldeinstellung] (http://stackoverflow.com/questions/1178104/error-setting-a-default- Null-Wert-für-ein-Annotations-Feld) – fracz

Antwort

16

Nein, Sie können null nicht für einen Anmerkungsattributwert verwenden. Sie können jedoch einen Array-Typ verwenden und ein leeres Array bereitstellen.

public @interface Foo { 
    Config[] value(); 
} 
... 
@Foo(value = {}) 

oder

public @interface Foo { 
    Config[] value() default {}; 
} 
... 
@Foo 
+0

Ja, aber ich muss immer '@Foo (value = {})' schreiben und in 90% der Fälle möchte ich keine andere Konfiguration bereitstellen, also würde ich das tun mag nur '@ Foo' haben – sockeqwe

+1

@sockeqwe Es ist so einfach wie das Setzen eines' default {} '. –

+0

ah, richtig ... Großartig! Vielen Dank! Ich werde Ihre Antwort in 5 Minuten akzeptieren (Stackoverflow sagt, ich muss 5 Minuten warten, bis ich eine Antwort akzeptieren kann) – sockeqwe

Verwandte Themen