[英]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.