2015-12-04 14 views
29

Tôi vừa mới bắt đầu sử dụng chú thích @NotNull với Java 8 và nhận được một số kết quả không mong muốn.Sử dụng Chú thích Không Chú ý trong đối số phương thức

Tôi có một phương pháp như thế này:

public List<Found> findStuff(@NotNull List<Searching> searchingList) { 
    ... code here ... 
} 

Tôi đã viết một bài kiểm tra JUnit đi qua trong giá trị null cho searchingList tranh cãi. Tôi đã mong đợi một số loại lỗi xảy ra nhưng nó đã trải qua như thể chú thích không có ở đó. Đây có phải là hành vi mong đợi không? Từ những gì tôi hiểu, điều này là để cho phép bạn bỏ qua viết mã kiểm tra không có bản mẫu.

Giải thích về chính xác những gì chính xác của @NotNull được thực hiện sẽ được đánh giá cao.

+8

'@ NotNull' chỉ là một chú thích. Chú thích không tự làm gì. Họ cần một bộ xử lý chú thích tại thời gian biên dịch, hoặc một cái gì đó xử lý nó trong thời gian chạy. –

+0

Bạn có đang chạy mã bên trong một máy chủ ứng dụng (ví dụ sử dụng [Arquillian] (http://arquillian.org/)) không? –

+0

@SotiriosDelimanolis - Vậy thì vấn đề là gì, chỉ là một cảnh báo cho bất kỳ ai gọi phương thức không truyền giá trị null? Trong trường hợp đó bạn vẫn cần mã xác nhận con trỏ null. – DavidR

Trả lời

42

@Nullable và @NotNull không làm gì cả. Chúng được coi là công cụ Tài liệu.

Các Chú @Nullable nhắc nhở bạn về sự cần thiết để giới thiệu một kiểm tra NPE khi:

  1. phương pháp có thể trở về null Calling.
  2. Biến dereferencing (trường, biến cục bộ, tham số) có thể là rỗng.

Các @NotNull Chú là, trên thực tế, một hợp đồng rõ ràng tuyên bố như sau:

  1. Một phương pháp không nên trả về null.
  2. Biến (như trường, biến cục bộ và tham số) không được giữ giá trị rỗng.

dụ:

thay vì viết:

/** 
* @param aX should not be null 
*/ 
public void setX(
    final Object aX) 
{ 
... 
} 

bạn có thể sử dụng

public void setX(
    @NotNull 
    final Object aX) 
{ 
... 
} 
+0

Vì vậy, chỉ để làm rõ phần 2 của phần NotNull, thực sự nó nên nói "không nên", không "không thể" vì nó không thể thực thi giường? Hoặc nếu nó có thể được thi hành trong thời gian chạy, làm thế nào bạn sẽ đi về điều đó? – DavidR

+0

Vâng, đó là "không nên" ... việc triển khai phương pháp nên thực thi hợp đồng. –

+1

Hoặc, trong Java 8, 'Tùy chọn' có thể được sử dụng thay cho' @ Null' trong giá trị trả về và quá tải phương thức thay cho '@ Null' trong danh sách tham số: http://dolszewski.com/java/java -8-optional-use-cases/ –

3

SO @NotNull chỉ là một thẻ ... Nếu bạn muốn xác nhận nó, sau đó bạn phải sử dụng một cái gì đó như validator hibernate jsr 303

ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); 
Validator validator = validatorFactory.getValidator(); 
Set<ConstraintViolation<List<Searching>> violations = validator.validate(searchingList); 
+0

Tôi đặt điều này ở đâu, ở đầu phương pháp? – DavidR

+0

vâng ..để bắt đầu phương pháp ... đây chỉ là một trong các triển khai xác thực, có thể có những người khác ... – Naruto

+0

Ok. Nhưng ý nghĩa của những gì mã đó sẽ không thay đổi có hay không tôi có chú thích @NotNull trong đối số param? – DavidR

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