2012-02-20 13 views
18

क्या दो एनोटेशन को एक-दूसरे के पारस्परिक रूप से अनन्य होने के रूप में चिह्नित करना संभव है?परस्पर अनन्य एनोटेशन

मैं एक कस्टम JUnit धावक (कम अधिमानतः) एक रनटाइम त्रुटि मिल गया है और मुझे यकीन है कि अगर एक परीक्षण @Test के साथ अपने एनोटेशन @Custom यह अंकन के साथ चिह्नित है (अधिमानतः) फेंक जाएगा बनाने के लिए एक संकलन त्रुटि चाहते हैं या।

कारण मुझे यह चाहिए कि @Custom मूल रूप से @Test है लेकिन परीक्षण से पहले कुछ अतिरिक्त प्री-प्रोसेसिंग के साथ। और, जिस तरह से मैंने इसे कोड किया है, प्रत्येक कस्टम टैग के लिए (हाँ, एक से अधिक है), परीक्षण प्रत्येक बार संबंधित प्री-प्रोसेसिंग के साथ कई बार चलाया जाएगा। इसलिए, इसे @Test के लिए चलाने के साथ-साथ यह समझ में नहीं आता है क्योंकि उस परीक्षण का अर्थ कुछ प्री-प्रोसेसिंग है।

और, हाँ, मैं अपने ढांचे में @Custom और @Test दोनों का समर्थन करना चाहता हूं (हालांकि, एक ही परीक्षण विधि के लिए नहीं)।

+5

ठीक है, आप इसे रनटाइम त्रुटि के रूप में आसानी से कार्यान्वित कर सकते हैं; आपके '@ कस्टम' को संसाधित करने वाले कोड के दौरान बस यह जांचें कि '@ टेस्ट' अतिरिक्त रूप से मौजूद है या नहीं। मुझे विश्वास नहीं है कि एनोटेशन प्रोसेसर के उपयोग के बिना संकलन समय पर यह संभव है; दर्द का एक पूरा क्षेत्र जो संभवतः सार्थक नहीं है। – FauxFaux

+2

पीएमडी जैसे स्थिर विश्लेषण उपकरण यहां सहायता कर सकते हैं। –

+0

इसे आजमाएं http://stackoverflow.com/questions/378616/can-i-generate-a-compile-time-error-based-on-the-type-of-the-field-being-annotat – Shahzeb

उत्तर

1

जावा तत्व पर आप जो एनोटेशन डाल सकते हैं उस पर सीमाएं डालने का कोई तरीका नहीं है। तो, उदाहरण के लिए, आप @Required और @Optional दोनों के रूप में फ़ील्ड को चिह्नित कर सकते हैं, भले ही यह पूरी तरह से बकवास हो।

आपको रनटाइम पर चेक करना होगा कि कौन सी एनोटेशन मौजूद हैं, या उस विशिष्ट व्यक्ति की तलाश करके, जिसमें आप रुचि रखते हैं, और उसके बाद एक अपवाद फेंक दें (जिसे यूनिट टेस्ट द्वारा पकड़ा जाएगा)।

आपकी विशिष्ट समस्या का बेहतर समाधान हो सकता है। यदि आप विशेष रूप से कुछ परीक्षण मामलों का इलाज करना चाहते हैं, तो आप अपने स्वयं के परीक्षण धावक को लागू करना चाहते हैं और इसे आमंत्रित करने के लिए @RunWith एनोटेशन का उपयोग करना चाहेंगे। फिर, आप सुनिश्चित कर सकते हैं कि आपके @Custom विधियों को पूर्व कार्यवाही मिलें।

1

आप जावा एनोटेशन प्रोसेसिंग का उपयोग अपने लिए ऐसा करने के लिए कर सकते हैं (एक पोस्ट-कंपाइल ऑपरेशन को कॉल करके जो बदले में संकलन कार्य में विफल रहता है), लेकिन यह अनिवार्य रूप से जटिल है। (यदि आप वास्तव में चाहते हैं, तो मुझे बताएं और मैं आपके लिए वह कोड खोदता हूं)। अधिक आसानी से यह एक छोटी सी कक्षा होगी जिसे आप मैन्युअल रूप से कॉल करते हैं जो जानकारी एकत्र करता है।

तो अधिक सटीक: आप यह आप के लिए (अपने आप को और केवल आप) सुविधा के रूप में की आवश्यकता है या आप एक स्वचालित समाधान के रूप में अपने विशाल परियोजना के लिए इसकी आवश्यकता है (और उस में कुछ प्रयास डाल करने के लिए तैयार हैं?)

0

चूंकि कोड आपके ढांचे में चल रहा है, इसलिए आप @Custom के साथ एनोटेटेड सभी कक्षाओं में पॉइंटकूट जोड़कर परस्पर अनन्य संबंधों को देखने के लिए एओपी कोड जोड़ सकते हैं और यदि @Test एनोटेटेड भी है, तो RuntimeException फेंक दें।

संबंधित मुद्दे