2012-08-02 37 views
20

Câu hỏi của tôi là theo dõi tới this one.Làm thế nào để chỉ ra rằng các trường thành viên là @Nonnull theo mặc định?

Trong các phiên bản trước đây của FindBugs, nó đã có thể sử dụng @DefaultAnnotation(Nonnull.class) hoặc @DefaultAnnotationForFields(Nonnull.class) để chỉ ra rằng tất cả các lĩnh vực trong một gói phải được coi là @Nonnull. Trong phiên bản hiện tại của FindBugs (2.0), @DefaultAnnotation@DefaultAnnotationForFields không còn được dùng nữa và tất cả chúng ta nên sử dụng JSR-305 để thay thế. Nhưng JSR-305 dường như không bao gồm tất cả các chú thích FindBugs (bây giờ không được chấp nhận).

Các javadoc không đề nghị một số giải pháp thay thế:

  • @ParametersAreNonnullByDefault. Điều này (rõ ràng) chỉ áp dụng cho các tham số, không áp dụng cho các trường thành viên.
  • @CheckReturnValue, khi áp dụng cho loại hoặc gói. Một lần nữa, điều này không áp dụng cho các trường thành viên.
  • @TypeQualifierDefault. Có lẽ điều này có thể làm những gì tôi muốn, nhưng tôi không hiểu cách nó hoạt động, và tôi không thể tìm thấy bất kỳ tài liệu hoặc ví dụ về cách sử dụng hoặc ý định của nó, bên cạnh một số javadoc khó hiểu. Tôi nghĩ rằng nó sẽ giúp tôi tạo chú thích của riêng mình, nhưng tôi có thể chắc chắn rằng tất cả các công cụ (FindBugs, Eclipse, v.v.) sẽ giải thích chú thích mới này một cách chính xác (hoặc thậm chí cả)?

javadoc không cung cấp bất kỳ gợi ý nào về cách xử lý việc không dùng nữa. Vì vậy, bằng cách sử dụng phiên bản hiện tại của FindBugs và/hoặc JSR-305, làm thế nào tôi nên chỉ ra rằng tất cả các trường thành viên trong một gói nhất định (hoặc thậm chí trong một lớp nhất định) có nghĩa vụ phải được coi là @Nonnull? Không phải là một phiên bản nào? Thậm chí có thể không?

Trả lời

18

Tôi đã có một câu hỏi tương tự, và thấy rằng những điều sau đây dường như làm việc với FindBugs (2.0.1-RC2)

Tạo một file java với định nghĩa chú thích sau

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

tương tự, để thực thi rằng tất cả các giá trị trả lại từ một phương thức đều không null

và sau đó chú thích gói như bình thường.

tôi đã sử dụng sau đây để kiểm tra tôi (package-info.java)

@javax.annotation.ParametersAreNonnullByDefault 
@com.habit.lib.lang.FieldsAreNonNullByDefault 
@com.habit.lib.lang.ReturnTypesAreNonNullByDefault 

package com.mypackagename.subpkg; 
+5

Ah, vì vậy thủ đoạn này được xác định chú thích của riêng bạn ... Tôi đoán đó là mở rộng hơn, nhưng tôi không hiểu tại sao họ không thể tạo chú thích chuẩn cho trường hợp này giống như họ đã làm với ParametersAreNonnullByDefault. – jqno

+8

Lưu ý rằng bạn đang sử dụng cách viết hoa khác cho 'Nonnull' trong chú thích tùy chỉnh của mình hơn so với cách viết hoa trong JSR-305 có thể mời nhầm lẫn. –

Các vấn đề liên quan