2013-01-11 18 views
8

Tôi muốn tạo chú thích tùy chỉnh để ngăn chặn cảnh báo FindBugs riêng lẻ để làm cho việc sử dụng chúng dễ dàng hơn thông qua hoàn thành mã. Ví dụ, điều này bỏ qua các nhà xây dựng không đặt tất cả các trường @Nonnull.Chú thích tùy chỉnh để chặn cảnh báo FindBugs cụ thể

@TypeQualifierDefault(ElementType.CONSTRUCTOR) 
@SuppressFBWarnings("NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR") 
@Retention(RetentionPolicy.CLASS) 
public @interface SuppressNonnullFieldNotInitializedWarning 
{ } 

Tuy nhiên, tôi vẫn thấy cảnh báo khi sử dụng chú thích.

public class User { 
    @Nonnull 
    private String name; 

    @SuppressNonnullFieldNotInitializedWarning 
    public User() { 
     // "Nonnull field name is not initialized by new User()" 
    } 
} 

Tôi đã thử các chính sách lưu giữ và loại phần tử khác nhau, đặt chú thích trên hàm tạo và lớp, và thậm chí @TypeQualifierNickname.

Mẫu tương tự này hoạt động để áp dụng @Nonnull cho tất cả các trường trong một lớp học.

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

FindBugs hiển thị một cách chính xác một cảnh báo cho mã mà gán null để name.

@FieldsAreNonnullByDefault 
public class User { 
    private String name; 

    public UserModel() { 
     name = null; 
     // "Store of null value into field User.name annotated Nonnull" 
    } 
} 

Tôi tin rằng vấn đề là @SuppressFBWarnings không được đánh dấu với @TypeQualifier khi @Nonnull là, và do đó @TypeQualifierDefault@TypeQualifierNickname không áp dụng đối với nó. Nhưng phải có một số cơ chế khác để áp dụng một chú thích bằng cách sử dụng một chú thích khác.

+1

@ Chris: Câu trả lời đó mô tả cách sử dụng findbugs SuppressCảnh báo chú thích. Câu hỏi này là làm thế nào để tạo ra một chú thích mới mà ngăn chặn một cảnh báo tìm kiếm cụ thể. – TimK

+0

@Chris Bạn đã đăng liên kết thứ hai đã có tại đây: http://stackoverflow.com/questions/14285422/custom-annotation-to-suppress-a-specific-findbugs-warning#comment19837178_14285422 – steffen

Trả lời

1

(Không trả lời câu hỏi), nhưng nếu bạn chỉ muốn hoàn thành mã hoạt động tốt hơn với @SuppressFBWarnings, bạn có thể xác định static final String cho từng mã cảnh báo và sau đó sử dụng mã đó trong chú thích. ví dụ.

public final class FBWarningCodes { 
    private FBWarningCodes() { } 

    public static final String NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR = "NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR"; 
} 

Sau đó:

import static com.tmobile.tmo.cms.service.content.FBWarningCodes.*; 

@SuppressFBWarnings(NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR) 

(mặc dù phải thừa nhận là Eclipse không muốn làm mã hoàn trừ khi bạn chỉ định value= trong chú thích)

+0

Đây là giải pháp hiện tại của tôi, mặc dù tôi rút ngắn các tên liên tục. –

+3

Đây là một mẫu cho người dùng Eclipse: fb - '@ $ {suppress: newType (edu.umd.cs.findbugs.annotations.SuppressFBWarnings)} ($ {warning: newType (com.tmobile.tmo.cms.service.content. FBWarningCodes)}. $ {Cursor}) 'Gõ' fb', nhấn Ctrl-Space hai lần và chọn cảnh báo để chặn. –