2012-08-02 9 views
20

La mia domanda è un seguito a this one.Come indicare che i campi membri sono @Null per impostazione predefinita?

Nelle versioni precedenti di FindBugs, è stato possibile utilizzare @DefaultAnnotation(Nonnull.class) o @DefaultAnnotationForFields(Nonnull.class) per indicare che tutti i campi in un pacchetto devono essere trattati come @Nonnull. Nella versione corrente di FindBugs (2.0), @DefaultAnnotation e @DefaultAnnotationForFields sono deprecati e dovremmo utilizzare tutti JSR-305. Ma JSR-305 non sembra coprire tutto ciò che riguarda le annotazioni (ormai deprecate) delle annotazioni su FindBugs.

Il javadoc suggerisce una serie di alternative:

  • @ParametersAreNonnullByDefault. Questo (ovviamente) si applica solo ai parametri, non ai campi membri.
  • @CheckReturnValue, se applicato a un tipo o pacchetto. Di nuovo, questo non si applica ai campi membri.
  • @TypeQualifierDefault. Forse questo può fare ciò che voglio, ma non capisco come funziona, e non sono in grado di trovare alcuna documentazione o esempi sul suo utilizzo o intento, oltre a qualche javadoc criptico. Penso che mi aiuterà a creare le mie annotazioni, ma posso essere sicuro che tutti gli strumenti (FindBugs, Eclipse, ecc.) Interpreteranno correttamente questa nuova annotazione (o addirittura nulla)?

Il javadoc non fornisce alcun suggerimento su come gestire il suo ritiro.

Quindi, utilizzando le versioni correnti di FindBugs e/o JSR-305, come dovrei indicare che tutti i campi membro in un determinato pacchetto (o anche in una determinata classe) dovrebbero essere trattati come @Nonnull? È possibile?

risposta

18

avevo una domanda simile, e ha scoperto che il seguente sembra funzionare con findbugs (2.0.1-RC2)

creare un file Java con la seguente definizione di annotazione

@Nonnull 
@TypeQualifierDefault(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface FieldsAreNonNullByDefault 
{ 
} 

allo stesso modo, a imporre che tutti i valori restituiti da un metodo non siano nulli

@Nonnull 
@TypeQualifierDefault(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ReturnTypesAreNonNullByDefault 
{ 
} 

e quindi annotare il pacchetto normalmente.

ho usato la seguente per i miei esami (package-info.java)

@javax.annotation.ParametersAreNonnullByDefault 
@com.habit.lib.lang.FieldsAreNonNullByDefault 
@com.habit.lib.lang.ReturnTypesAreNonNullByDefault 

package com.mypackagename.subpkg; 
+5

Ah, quindi il trucco sta definendo la propria annotazione ... Direi che è più estensibile, ma non vedo il motivo per cui non possono semplicemente fare un'annotazione standard per questo caso come hanno fatto con ParametersAreNonnullByDefault. – jqno

+8

Si noti che si utilizzano diverse lettere maiuscole per 'Nonnull' nelle annotazioni personalizzate rispetto a quelle utilizzate in JSR-305 che possono invitare confusione. –

Problemi correlati