自定义注释以禁止特定的FindBugs警告

时间:2013-01-11 19:36:38

标签: java annotations findbugs

我想创建自定义注释以禁止单个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 个答案:

答案 0 :(得分:1)

(不是专门回答这个问题),但是如果您只想使用@SuppressFBWarnings更好地完成代码完成工作,则可以为每个警告代码定义static final String,然后使用注释。 e.g。

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=之外不想进行代码完成)