2013-01-11 12 views
8

Chcę utworzyć niestandardowe adnotacje, aby ukryć poszczególne ostrzeżenia FindBugs, aby ułatwić korzystanie z nich za pomocą zakończenia kodu. Na przykład ten ignoruje konstruktory, które nie ustawiają wszystkich pól.Adnotacje niestandardowe w celu powstrzymania określonego ostrzeżenia FindBugs

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

Mimo to nadal widzę ostrzeżenie podczas korzystania z adnotacji.

public class User { 
    @Nonnull 
    private String name; 

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

Próbowałem różnych polityk retencyjne i typy elementów, umieszczenie adnotacji na konstruktora i klasy, a nawet @TypeQualifierNickname.

Ten sam wzór działa, aby zastosować @Nonnull do wszystkich pól w klasie.

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

FindBugs poprawnie wyświetla ostrzeżenie o kodzie, który wyznacza null do name.

@FieldsAreNonnullByDefault 
public class User { 
    private String name; 

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

Uważam, że problemem jest to, że @SuppressFBWarnings nie jest oznaczony @TypeQualifier podczas @Nonnull jest, a tym samym @TypeQualifierDefault i @TypeQualifierNickname nie stosują się do niego. Ale musi istnieć jakiś inny mechanizm do zastosowania jednej adnotacji za pomocą innej.

+1

@Chris: To odpowiedź opisuje jak używać findbugs SuppressWarning adnotacja. To pytanie brzmi: jak utworzyć nową adnotację, która zignoruje ostrzeżenie o specjalnym locie. – TimK

+0

@Chris Wysłałeś już drugi link: http://stackoverflow.com/questions/14285422/custom-annotation-to-suppress-a-specific-findbugs-warning#comment19837178_14285422 – steffen

Odpowiedz

1

(Nie odpowiada konkretnie na pytanie), ale jeśli chcesz po prostu poprawić kodowanie z @SuppressFBWarnings, możesz zdefiniować static final String dla każdego z kodów ostrzegawczych, a następnie użyć ich w adnotacji. na przykład

public final class FBWarningCodes { 
    private FBWarningCodes() { } 

    public static final String NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR = "NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR"; 
} 

Następnie:

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

@SuppressFBWarnings(NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR) 

(choć wprawdzie Eclipse nie chce zrobić Podpowiedzi chyba że podasz value= w adnotacji)

+0

To jest moje obecne rozwiązanie, choć skracam stałe nazwy. –

+3

Oto szablon dla użytkowników Eclipse: fb - '@ $ {suppress: newType (edu.umd.cs.findbugs.annotations.SuppressFBWarnings)} ($ {warning: newType (com.tmobile.tmo.cms.service.content. FBWarningCodes)}. $ {Cursor}) 'Wpisz' fb', naciśnij dwukrotnie Ctrl-Spacja i wybierz ostrzeżenie do wyłączenia. –

Powiązane problemy