自定义注解以抑制特定的FindBugs警告。

10

我希望创建自定义注解来抑制个别FindBugs警告,以便更轻松地通过代码补全使用它们。例如,此注解忽略未设置所有@Nonnull字段的构造函数。

@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正确地显示了将null赋值给name的代码的警告。

@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:那个答案描述了如何使用findbugs SuppressWarning注释。这个问题是如何创建一个新的注释来抑制特定的findbugs警告。 - TimK
@Chris 你已经在这里发布了第二个链接:http://stackoverflow.com/questions/14285422/custom-annotation-to-suppress-a-specific-findbugs-warning#comment19837178_14285422 - steffen
1个回答

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)

(尽管不可否认的是,除非您在注释中指定value=,否则Eclipse不想执行代码完成)


这是我的当前解决方案,尽管我缩短了常量名称。 - David Harkness
3
这是针对Eclipse用户的模板:fb - @${suppress:newType(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)}(${warning:newType(com.tmobile.tmo.cms.service.content.FBWarningCodes)}.${cursor})。输入fb,按两次Ctrl-Space键,然后选择要抑制的警告。 - David Harkness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接