2016-02-09 10 views
5

मैं कोड साफ़ कर रहा था और स्थिर सदस्य तक सभी पहुंच बदल रहा था, जैसे कि वे कक्षा द्वारा योग्यता प्राप्त कर रहे हैं जिसमें उन्हें परिभाषित किया गया है। हालांकि, यह निम्नलिखित समस्या का कारण बनता है जो मुझे परेशान कर रहा है।आसपास के एक व्यक्ति द्वारा योग्यता प्राप्त होने पर नेस्टेड कक्षा से निजी स्थैतिक क्षेत्र दिखाई दे सकते हैं?

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

public class VisibilityTest { 

    @interface A { 
     int f(); 
    } 

    @A(f = VisibilityTest.v) //fails 
    private static class C { 
     int c = VisibilityTest.v; //works 
    } 

    @A(f = v) //works 
    private static class D { 
     int d = VisibilityTest.v; //works 
    } 

    private final static int v = 5; 

} 

दोनों मामलों में चर एक ही क्षेत्र को संदर्भित करता है, तो ऐसा क्यों होता है?

+2

कोई विचार नहीं, लेकिन दिलचस्प है, विशेष रूप से क्योंकि 'OuterClass.privateStaticField' idiom संकलित किया जाएगा, कहें, एक नेस्टेड क्लास की विधि के भीतर से, जो असंगत लगता है ... – Mena

+0

चूंकि एनोटेशन पैरामीटर संकलित-समय संकल्प योग्य होना चाहिए (हमारे मामले में, निरंतर अभिव्यक्ति), यह संकलक में एक गड़बड़ प्रतीत होता है। – biziclop

+0

क्या javac संस्करण का उपयोग किया जाता है? – hahn

उत्तर

4

यह 1.8.0_25 और 1.7.0_45 javac के साथ ठीक से संकलित करता है, जैसा कि वास्तव में होना चाहिए। या दोनों विफल होना चाहिए, यह भी सुसंगत होगा।

इस ग्रहण के एनोटेशन से निपटने में एक बग होने के लिए (जो कारण है कि आप खुशी से सामान्य कोड से ही लगातार संदर्भित कर सकते हैं) लगता है, यह reported काफी समय पहले किया गया था लेकिन वहाँ पिछले पर ज्यादा गतिविधि beeen नहीं किया गया है चार वर्ष।

+0

मैं समस्याओं के बिना सीधे जावैक के साथ संकलित करने में कामयाब रहा। मैं वास्तव में ग्रहण का उपयोग कर रहा हूं, इसलिए सबसे अधिक संभावना है कि यह एक ही बग – miselico

+0

@ मिस्सेलिको है क्योंकि इसके आसपास काम करना इतना आसान है, मैं उम्मीद करता हूं कि यह ठीक करने के लिए बग की सूची के नीचे एक बहुत लंबा रास्ता होगा। ग्रहण कंपाइलर की तुलना में कहीं बड़ी समस्याएं हैं :) – biziclop

-2

How to supply value to an annotation from a Constant java देखें।

असल में आप नहीं कर सकते हैं। एनोटेशन मान प्राइमेटिव्स या स्ट्रिंग्स होना चाहिए। आप किसी क्षेत्र, निजी या अन्यथा संदर्भित नहीं कर सकते हैं।

+0

चूंकि 'v' का प्रकार' int' है, इसका संदर्भ निरंतर अभिव्यक्ति है और इसलिए मान्य है। – biziclop

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