【问题标题】:Custom annotation to suppress a specific FindBugs warning自定义注释以抑制特定的 FindBugs 警告
【发布时间】: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


【解决方案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)

(尽管 Eclipse 不希望进行代码补全,除非您在注释中指定 value=)

【讨论】:

  • 这是我目前的解决方案,虽然我缩短了常量名称。
  • 这里是 Eclipse 用户的模板:fb - @${suppress:newType(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)}(${warning:newType(com.tmobile.tmo.cms.service.content.FBWarningCodes)}.${cursor}) 输入 fb,按两次 Ctrl-Space,然后选择要禁止显示的警告。
猜你喜欢
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 2017-03-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
相关资源
最近更新 更多