【发布时间】:2013-01-11 19:36:37
【问题描述】:
我想创建自定义注释来抑制单个 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 不适用于它。但是必须有其他一些机制来使用另一个注释来应用一个注释。
【问题讨论】:
-
@Chris:该答案描述了如何使用 findbugs SuppressWarning 注释。这个问题是如何创建一个新的注释来抑制特定的 findbugs 警告。
-
@Chris 你已经在这里发布了第二个链接:stackoverflow.com/questions/14285422/…
标签: java annotations findbugs