2013-01-11 42 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的正确显示该分配nullname代码警告。

@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

@克里斯:这个答案描述了如何使用findbugs SuppressWarning注释。这个问题是如何创建一个新的注释来抑制特定的findbugs警告。 – TimK

+0

@Chris您已在此处发布第二个链接:http://stackoverflow.com/questions/14285422/custom-annotation-to-suppress-a-specific-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) 

(但无可否认Eclipse不希望做代码完成,除非你在注释中注明value=

+0

这是我目前的解决方案,尽管我缩短了常数名称。 –

+3

下面是Eclipse用户的模板:fb - '@ $ {suppress:newType(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)}($ {warning:newType(com.tmobile.tmo.cms.service.content。 FBWarningCodes)}。$ {cursor})'键入'fb',按Ctrl-Space两次,然后选择要禁止的警告。 –