2013-02-18 23 views
10

मैं कोडएनोटेशन विशेषता के लिए मान निरंतर अभिव्यक्ति क्यों होना चाहिए?

@UIUnitTimeout(8*60*1000) // works 
@UIUnitTimeout(TimeUnit.MINUTES.toMillis(8)) // does not work 

का निम्न भाग मुझे पता है कि JLS के अनुसार केवल स्थिर भाव एनोटेशन विशेषताओं के मूल्यों के रूप में अनुमति दी जाती है हो रहा है। पर क्यों? डेटा प्रकार मिलान होने पर यह पर्याप्त क्यों नहीं है? क्या ऐसा कुछ भी है जो संभवतः गलत हो सकता है अगर रनटाइम पर अभिव्यक्तियों का मूल्यांकन किया जाए? क्या प्रत्येक विनिर्देश के पीछे तार्किक तर्क है?

+0

http://stackoverflow.com/questions/7926596/value-for-the-annotation-attribute-must-be-constant-expression – BobTheBuilder

+0

एनोटेशन एक संकलन-समय निरंतर नहीं होना चाहिए? –

+0

@baraky ओपी पहले से ही यह जानता है। – assylias

उत्तर

9

एक एनोटेशन प्रकार के बारे में एक प्रकार एक्सटेंशन या मेटाडेटा की तरह है।

क्योंकि जावा एक स्थैतिक टाइप की गई भाषा है (जिसका अर्थ है कि प्रकार संकलन समय पर ज्ञात हैं), ऐसा लगता है कि एनोटेशन विशेषता डेटा (मेटाडाटा) संकलन समय पर भी जाना जाता है - आप एनोटेशन के बारे में डेटा परिभाषित/घोषित कर रहे हैं (विस्तार)।

और एक विशुद्ध रूप से व्यावहारिक बिंदु के रूप में, annotation processing है, जो एक संकलन समय है के लिए (वैकल्पिक) कदम है, गुण डेटा चाहिए संकलन समय पर जाना जा - यदि अभी भी क्रम पर्यावरण तक नहीं पहुंचे हैं, फिर भी आप की जरूरत विशेषता डेटा।

3

एनोटेशन प्रीप्रोसेसिंग को एनोटेटेड कोड निष्पादित करने से पहले एनोटेशन के मूल्य को जानना आवश्यक है। इसके अलावा, एनोटेशन परिभाषाएं स्वयं @Retention के साथ अंकित होती हैं, जिसका मूल्य RetentionPolicy (यदि निर्दिष्ट नहीं है, तो यह क्लास पर डिफ़ॉल्ट है)।

इसलिए एनोटेशन के 3 अलग-अलग "प्रकार" हैं, और केवल उन एनोटेशन को RUNTIME के ​​रूप में घोषित किया जाएगा जब प्रोग्राम निष्पादित किया जाएगा। (लेकिन उनके मूल्य, निरंतर होना चाहिए ताकि वे जुड़े कोड को क्रियान्वित करने के बिना परिभाषित रहते हैं।)

कक्षा एनोटेशन संकलक द्वारा वर्ग फ़ाइल में दर्ज हो रहे हैं लेकिन रन पर वीएम द्वारा बनाए रखा होने की जरूरत नहीं पहर।

RUNTIME एनोटेशन को संकलक द्वारा कक्षा फ़ाइल में दर्ज किया जाना है और रन वी पर वीएम द्वारा बनाए रखा गया है, इसलिए उन्हें प्रतिबिंबित रूप से पढ़ा जा सकता है।

स्रोत एनोटेशन को कंपाइलर द्वारा त्याग दिया जाना है।

+0

क्षमा करें बोहेमियन, मैंने एनोटेशन प्रोसेसिंग के बारे में आपकी पोस्टिंग नहीं देखी। – Javier

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

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