Tôi có thể thấy rằng @Nullablevà @Nonnullcác chú thích có thể hữu ích trong việc ngăn chặn NullPointerExceptions 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
@Nonnulllà 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 @Nonnulllà nullkhông có bất kỳ khiếu nại nào. Nó ném một NullPointerExceptionkhi 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?
@Nonnullkhi gọi một @Nonnullphươ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) ycó 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).
@Nonnullvà @Nullablebạ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?

@Nullablehoặc@Nonnull, nhưng nếu chúng có giá trị thì rất "có khả năng thu hút tranh luận"