我希望创建自定义注解来抑制个别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
不适用于它。但一定有其他机制可以使用一种注释来应用另一种注释。