我想创建自定义注释来抑制单个 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
while is 标记,@Nonnull
因此不适用于它。但是必须有其他一些机制来使用另一个注释应用一个注释。@TypeQualifierDefault
@TypeQualifierNickname