Tôi có thể thấy rằng @Nullable
và @Nonnull
các chú thích có thể hữu ích trong việc ngăn chặn NullPointerException
s nhưng chúng không lan truyền rất xa.
- Hiệu quả của các chú thích này giảm hoàn toàn sau một cấp độ gián tiếp, vì vậy nếu bạn chỉ thêm một vài chú thích thì chúng không lan truyền rất xa.
- Vì các chú thích này không được thi hành tốt, nên có nguy cơ giả sử giá trị được đánh dấu
@Nonnull
là không rỗng và do đó không thực hiện kiểm tra null.
Mã dưới đây gây ra một tham số được đánh dấu @Nonnull
là null
không có bất kỳ khiếu nại nào. Nó ném một NullPointerException
khi nó được chạy.
public class Clazz {
public static void main(String[] args){
Clazz clazz = new Clazz();
// this line raises a complaint with the IDE (IntelliJ 11)
clazz.directPathToA(null);
// this line does not
clazz.indirectPathToA(null);
}
public void indirectPathToA(Integer y){
directPathToA(y);
}
public void directPathToA(@Nonnull Integer x){
x.toString(); // do stuff to x
}
}
Có cách nào để làm cho các chú thích này được thực thi nghiêm ngặt hơn và / hoặc tuyên truyền hơn nữa không?
@Nonnull
khi gọi một @Nonnull
phương thức có biến nullable. Tất nhiên, việc truyền với một chú thích là không thể trong Java 7, nhưng Java 8 sẽ thêm khả năng áp dụng các chú thích vào việc sử dụng một biến, bao gồm cả các phôi. Vì vậy, điều này có thể trở nên có thể thực hiện trong Java 8.
(@NonNull Integer) y
có thể về mặt cú pháp là có thể, nhưng trình biên dịch không được phép phát ra bất kỳ mã byte cụ thể nào dựa trên chú thích. Đối với các xác nhận thời gian chạy, các phương thức trợ giúp nhỏ là đủ như đã thảo luận trong bug.eclipse.org/442103 (ví dụ directPathToA(assertNonNull(y))
:) - nhưng hãy nhớ, điều này chỉ giúp thất bại nhanh. Cách an toàn duy nhất là bằng cách thực hiện kiểm tra null thực tế (cộng với hy vọng việc triển khai thay thế trong nhánh khác).
@Nonnull
và @Nullable
bạn đang nói về điều gì, vì có nhiều chú thích tương tự (Xem câu hỏi này ). Bạn đang nói về các chú thích trong gói javax.annotation
?
@Nullable
hoặc@Nonnull
, nhưng nếu chúng có giá trị thì rất "có khả năng thu hút tranh luận"