Class<? extends Foo> bar() default null;// this doesn't compile
के रूप में उल्लेख किया है, जावा भाषा विनिर्देश एनोटेशन चूक में शून्य मान अनुमति नहीं है।
मुझे क्या करना है एनोटेशन परिभाषा के शीर्ष पर DEFAULT_VALUE
स्थिरांक को परिभाषित करना है। कुछ की तरह:
public static final String DEFAULT_VALUE = "__class-name-here__ default";
public String prefix() default DEFAULT_VALUE;
तब मेरे कोड में
मैं की तरह कुछ कार्य करें: एक वर्ग के साथ
if (myAnnotation.prefix().equals(MyAnnotation.DEFAULT_VALUE)) { ... }
आप मामले में, मैं सिर्फ एक मार्कर वर्ग को परिभाषित करेगा। दुर्भाग्य से आप इस के लिए एक निरंतर तो बजाय आप की तरह कुछ करने की ज़रूरत नहीं हो सकता है:
Class<? extends Foo> bar() default DefaultFoo.class;
आपका DefaultFoo
वर्ग ताकि कोड कर सकते हैं होगा सिर्फ एक खाली कार्यान्वयन:
if (myAnnotation.bar() == DefaultFoo.class) { ... }
इस आशा किसी और की मदद करता है।
हां, हम कुछ ऐसा करते हैं (हम केवल Foo.class को डिफ़ॉल्ट के रूप में उपयोग करते हैं)। बेकार है। – ripper234
और स्ट्रिंग फ़ील्ड के मामले में, आपको [जादू तार] (http://en.wikipedia.org/wiki/Magic_string) का सहारा लेना होगा। स्पष्ट रूप से जाने-माने एंटीपेटर्न अब अच्छी तरह से समझी जाने वाली भाषा सुविधाओं से बेहतर हैं। –
@TimYates यह मुझे लोगों को अपने "कोई मूल्य" सेंटीनेल मूल्य को परिभाषित करने के लिए मारता है जब शून्य उपलब्ध होता है और सार्वभौमिक रूप से समझा जाता है। और अब भाषा की आवश्यकता है ?! सौभाग्य से, आप अपने "जादू तार" को सार्वजनिक स्थिरांक के रूप में परिभाषित कर सकते हैं। यह अभी भी आदर्श नहीं है लेकिन कम से कम वह कोड जो आपकी एनोटेशन की तलाश में है, हर जगह अक्षर का उपयोग करने के बजाय निरंतर संदर्भित कर सकता है। – spaaarky21