Sử dụng chú thích @Nullable


347

Tôi thấy một số phương thức trong java được khai báo là:

void foo(@Nullable Object obj)
{ ... }

Ý nghĩa của @Nullableđây là gì? Có nghĩa là đầu vào có thể được null?

Không có chú thích, đầu vào vẫn có thể là null, vì vậy tôi đoán đó không chỉ là nó?


3
Từ các câu trả lời dưới đây, tôi đã học được rằng chú thích chỉ ra các giá trị null được chấp nhận, các ví dụ về nơi nó được sử dụng, các máy phân tích mã tôi có thể thử và các diễn giải có thể thay đổi. Xem tại sao định dạng này là một tốt? + 1s tất cả các vòng, đặc biệt là khi đặt câu hỏi này.
icedwater

8
Thư viện nào đang cung cấp @Nullabletrong bối cảnh câu hỏi của bạn? Có phải là Checker không?
8bitjunkie

Câu trả lời:


367

Nó làm rõ rằng phương thức chấp nhận các giá trị null và nếu bạn ghi đè phương thức, bạn cũng nên chấp nhận các giá trị null.

Nó cũng phục vụ như một gợi ý cho các máy phân tích mã như FindBugs . Ví dụ: nếu một phương thức như vậy hủy bỏ đối số của nó mà không kiểm tra null trước, FindBugs sẽ phát ra cảnh báo.


82

Chú thích này thường được sử dụng để loại bỏ NullPointerExceptions. @Nullablenói rằng tham số này có thể là null. Một ví dụ điển hình về hành vi như vậy có thể được tìm thấy trong Google Guice . Trong khuôn khổ tiêm phụ thuộc nhẹ này, bạn có thể nói rằng sự phụ thuộc này có thể null. Nếu bạn cố gắng vượt quanull mà không có chú thích, khung sẽ từ chối thực hiện công việc đó.

Những gì nhiều hơn @Nullablecó thể được sử dụng với @NotNullchú thích. Ở đây bạn có thể tìm thấy một số lời khuyên về cách sử dụng chúng đúng cách. Kiểm tra mã trong IntelliJ kiểm tra các chú thích và giúp gỡ lỗi mã.



1

Cấp, chắc chắn có những suy nghĩ khác nhau, trong thế giới của tôi, tôi không thể thực thi "Không bao giờ vượt qua" vì tôi đang giao dịch với các bên thứ ba không kiểm soát được như người gọi API, hồ sơ cơ sở dữ liệu, lập trình viên cũ, v.v. . Vì bạn đang ở trên Java8 trở lên, có một cách tiếp cận sạch hơn một chút so với một ifkhối.

public String foo(@Nullable String mayBeNothing) {
   return Optional.ofNullable(mayBeNothing).orElse("Really Nothing");
}

Bạn cũng có thể ném một số ngoại lệ trong đó bằng cách trao đổi .orElseđể orElseThrow(() -> new Exception("Dont' send a null")).

Nếu bạn không muốn sử dụng @Nullable, không thêm chức năng nào, tại sao không chỉ đặt tên cho tham số mayBe...để ý định của bạn rõ ràng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.