2013-01-11 11 views
8

मैं अलग-अलग FindBugs चेतावनियों को दबाने के लिए कस्टम एनोटेशन बनाना चाहता हूं ताकि कोड-समापन के माध्यम से उनका उपयोग करना आसान हो सके। उदाहरण के लिए, यह उन रचनाकारों को अनदेखा करता है जो सभी @Nonnull फ़ील्ड सेट नहीं करते हैं।एक विशिष्ट FindBugs चेतावनी दबाने के लिए कस्टम एनोटेशन

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

हालांकि, एनोटेशन का उपयोग करते समय भी मुझे चेतावनी दिखाई देती है।

public class User { 
    @Nonnull 
    private String name; 

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

मैं अलग अवधारण नीतियों और तत्व प्रकार की कोशिश की है, निर्माता और वर्ग, और यहां तक ​​कि @TypeQualifierNickname पर एनोटेशन डाल।

यह वही पैटर्न कक्षा में सभी क्षेत्रों में @Nonnull लागू करने के लिए काम करता है।

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

FindBugs सही ढंग से कोड है कि name को null प्रदान करती है के लिए एक चेतावनी प्रदर्शित करता है।

@FieldsAreNonnullByDefault 
public class User { 
    private String name; 

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

मेरा मानना ​​है कि समस्या यह है कि @SuppressFBWarnings@TypeQualifier साथ चिह्नित नहीं है @Nonnull है, जबकि, और इस तरह @TypeQualifierDefault और @TypeQualifierNickname इस पर लागू नहीं है। लेकिन किसी अन्य का उपयोग करके एक एनोटेशन लागू करने के लिए कुछ अन्य तंत्र होना चाहिए।

+1

@Chris (हालांकि बेशक ग्रहण जब तक आप एनोटेशन में value= निर्दिष्ट कोड: पूर्ण करने करने के लिए नहीं चाहता है): यह जवाब बताता है कि कैसे उपयोग करने के लिए Findbugs SuppressWarning एनोटेशन। यह सवाल यह है कि एक नई एनोटेशन कैसे बनाएं जो विशिष्ट खोजबग चेतावनी को दबाए। – TimK

+0

@ क्रिस आपने पहले से ही दूसरा लिंक पोस्ट किया है: http://stackoverflow.com/questions/14285422/custom-annotation-to-suppress-a- स्पेसिफिक-findbugs-warning#comment19837178_14285422 – steffen

उत्तर

1

(विशेष रूप से सवाल का जवाब नहीं), लेकिन अगर आप सिर्फ कोड: पूर्ण करने का काम @SuppressFBWarnings के साथ बेहतर बनाना चाहते हैं, तो आप चेतावनी कोड से प्रत्येक के लिए एक static final String निर्धारित कर सकते हैं और फिर एनोटेशन में उन का उपयोग करें। जैसे

public final class FBWarningCodes { 
    private FBWarningCodes() { } 

    public static final String NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR = "NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR"; 
} 
फिर

:

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

@SuppressFBWarnings(NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR) 

+0

यह मेरा वर्तमान समाधान है, हालांकि मैं छोटा करता हूं निरंतर नाम –

+3

ग्रहण उपयोगकर्ताओं के लिए यहां एक टेम्पलेट है: fb - '@ $ {suppress: newType (edu.umd.cs.findbugs.annotations.SuppressFBWarnings)} ($ {चेतावनी: newType (com.tmobile.tmo.cms.service.content। एफबी चेतावनी कोड)} $ {कर्सर}) 'टाइप' एफबी', Ctrl-space दो बार दबाएं, और दबाने के लिए चेतावनी का चयन करें। –

संबंधित मुद्दे