簡體   English   中英

自定義注釋以禁止特定的FindBugs警告

[英]Custom annotation to suppress a specific FindBugs warning

我想創建自定義注釋來抑制單個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中的所有字段。

@Nonnull
@TypeQualifierDefault(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldsAreNonnullByDefault
{ }

FindBugs正確顯示為name指定null代碼的警告。

@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不適用於它。 但是必須有一些其他機制來使用另一個注釋來應用一個注釋。

(不是專門回答這個問題),但是如果你只是想用@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=不想進行代碼完成)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM