2013-01-11 14 views
8

Desidero creare annotazioni personalizzate per sopprimere i singoli avvisi di FindBugs per semplificare l'utilizzo tramite il completamento del codice. Ad esempio, questo ignora i costruttori che non impostano tutti i campi @Nonnull.Annotazione personalizzata per sopprimere un avviso specifico FindBugs

@TypeQualifierDefault(ElementType.CONSTRUCTOR) 
@SuppressFBWarnings("NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR") 
@Retention(RetentionPolicy.CLASS) 
public @interface SuppressNonnullFieldNotInitializedWarning 
{ } 

Tuttavia, continuo a vedere l'avviso quando si utilizza l'annotazione.

public class User { 
    @Nonnull 
    private String name; 

    @SuppressNonnullFieldNotInitializedWarning 
    public User() { 
     // "Nonnull field name is not initialized by new User()" 
    } 
} 

Ho provato diversi criteri di conservazione e tipi di elementi, mettendo l'annotazione sul costruttore e la classe, e anche @TypeQualifierNickname.

Questo stesso schema funziona per applicare @Nonnull a tutti i campi di una classe.

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

FindBugs visualizza correttamente un avvertimento per il codice che assegna null a name.

@FieldsAreNonnullByDefault 
public class User { 
    private String name; 

    public UserModel() { 
     name = null; 
     // "Store of null value into field User.name annotated Nonnull" 
    } 
} 

Credo che il problema è che @SuppressFBWarnings non è contrassegnato con @TypeQualifier mentre @Nonnull è, e quindi @TypeQualifierDefault e @TypeQualifierNickname non si applicano ad esso. Ma ci deve essere un altro meccanismo per applicare un'annotazione usando un altro.

+1

@ Chris: La risposta descrive come utilizzare il findbugs SuppressWarning annotation. Questa domanda è come creare una nuova annotazione che sopprime un avviso specifico sui findbug. – TimK

+0

@Chris Hai già postato il secondo link qui: http://stackoverflow.com/questions/14285422/custom-annotation-to-suppress-a-specific-findbugs-warning#comment19837178_14285422 – steffen

risposta

1

(Non rispondere in modo specifico alla domanda), ma se si desidera semplificare il completamento del codice con @SuppressFBWarnings, è possibile definire uno static final String per ciascuno dei codici di avviso e quindi utilizzarli nell'annotazione. per esempio.

public final class FBWarningCodes { 
    private FBWarningCodes() { } 

    public static final String NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR = "NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR"; 
} 

Poi:

import static com.tmobile.tmo.cms.service.content.FBWarningCodes.*; 

@SuppressFBWarnings(NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR) 

(anche se certamente Eclipse non vuole fare completamento del codice a meno che non si specifica value= nel annotazione)

+0

Questa è la mia soluzione attuale, sebbene accorci i nomi costanti. –

+3

Ecco un modello per gli utenti di Eclipse: fb - '@ $ {suppress: newType (edu.umd.cs.findbugs.annotations.SuppressFBWarnings)} ($ {warning: newType (com.tmobile.tmo.cms.service.content. FBWarningCodes)}. $ {Cursor}) 'Digita' fb', premi Ctrl-Space due volte e seleziona l'avviso da sopprimere. –

Problemi correlati