10

カスタム注釈を作成して個々の 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"
    }
}

問題はwhile is で@SuppressFBWarningsマークされていないことであり、したがってandはそれに当てはまらないと思います。しかし、別のアノテーションを使用してあるアノテーションを適用するには、別のメカニズムが必要です。@TypeQualifier@Nonnull@TypeQualifierDefault@TypeQualifierNickname

4

1 に答える 1

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)

(確かvalue=に、注釈で指定しない限り、Eclipseはコード補完を行いたくありません)

于 2013-01-16T14:01:53.193 に答える