Class<? extends Foo> bar() default null;// this doesn't compile
Như đã đề cập, đặc tả ngôn ngữ Java không cho phép giá trị null trong giá trị mặc định chú thích.
Điều tôi có xu hướng làm là xác định các hằng số DEFAULT_VALUE
ở đầu định nghĩa chú thích. Một cái gì đó như:
public static final String DEFAULT_VALUE = "__class-name-here__ default";
public String prefix() default DEFAULT_VALUE;
Sau đó trong mã của tôi, tôi làm điều gì đó như:
if (myAnnotation.prefix().equals(MyAnnotation.DEFAULT_VALUE)) { ... }
Trong trường hợp bạn có một lớp học, tôi sẽ chỉ định nghĩa một lớp marker. Đáng tiếc là bạn không thể có một hằng số cho điều này để thay vào đó bạn cần phải làm điều gì đó như:
Class<? extends Foo> bar() default DefaultFoo.class;
lớp DefaultFoo
của bạn sẽ chỉ là một thực phẩm nào để mã có thể làm:
if (myAnnotation.bar() == DefaultFoo.class) { ... }
Hy vọng điều này giúp người khác.
Có, chúng tôi làm điều gì đó tương tự (chúng tôi chỉ sử dụng Foo.class làm mặc định). Sucks. – ripper234
Và trong trường hợp của các trường String, bạn phải sử dụng [chuỗi ma thuật] (http://en.wikipedia.org/wiki/Magic_string). Rõ ràng các mẫu antipatterns nổi tiếng là tốt hơn so với các tính năng ngôn ngữ được hiểu rõ hiện nay. –
@TimYates Nó giết chết tôi để thấy mọi người định nghĩa giá trị sentinel "không có giá trị" của riêng mình khi có sẵn và hiểu được toàn bộ. Và bây giờ nó được yêu cầu bởi chính ngôn ngữ đó ?! May mắn thay, bạn có thể xác định "chuỗi ma thuật" của bạn là hằng số công khai. Nó vẫn không lý tưởng nhưng ít nhất mã tìm kiếm chú thích của bạn có thể tham chiếu hằng số thay vì sử dụng các chữ trong mọi nơi. – spaaarky21