2009-02-11 18 views
5

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

public class Main1 { 
    public static void main(String[] args) { 
     Comparable c1 = new Comparable(){ 
      int x = 3; 
      public int compareTo(Object o) { 
       Comparable c2 = new Comparable(){ 
        int x = 4; 
        public int compareTo(Object o) { 
         return x; // <-- THIS LINE 
        } 
       }; 
       return c2.compareTo(o); 
      } 
     }; 
     System.out.println(c1.compareTo(null)); 
    } 
} 

जब यह कोड चलता है, 4 के मान मुद्रित क्योंकि इस बात का c2 के क्षेत्र एक्स मूल्य है। हालांकि, मैं "इस लाइन" चिह्नित रेखा को बदलना चाहता हूं ताकि यह बाहरी वर्ग के x (यानी, सी 1 के फील्ड एक्स, मान 3 के साथ) लौटाए। यदि बाहरी वर्ग (अर्थात, c1 की क्लास) एक नामित वर्ग एक थे, तो मैं बदल सकते

return x; 

साथ

return A.this.x; 

लेकिन चूंकि बाहरी वर्ग भी अनाम है, मेरे पास नहीं है उपयोग करने के लिए एक नाम।

प्रश्न: क्या "इस लाइन" लेबल वाली रेखा को संशोधित करने का कोई तरीका है ताकि यह अज्ञात वर्गों को नामित कक्षाओं में बदलने के बिना सी 2 के बजाय सी 1 के फील्ड एक्स को संदर्भित करे?

मुझे एहसास है कि यह कोड वास्तव में बदसूरत है और यह अज्ञात कक्षाओं का उपयोग करने के लिए अच्छी प्रोग्रामिंग शैली नहीं है, लेकिन कोड किसी अन्य प्रोग्राम द्वारा उत्पन्न किया जा रहा है, और जनरेटर को लागू करने का यह सबसे आसान तरीका है।

उत्तर

4

मैं x के अलावा अन्य नाम चुनकर अन्य चर को छिपाने से बचूंगा।

0

मेरा मानना ​​है कि आपको फ़ील्ड्स फाइनल घोषित करना होगा - आपके द्वारा वहां मौजूद कोड केवल की शिकायत कर रहे हैं। सच नहीं।

यह क्लासिक केस जैसा दिखता है जहां लिस्प के gensym जैसी चीजें चीजों को आसान बनाती हैं। दूसरे शब्दों में, कोड जनरेटर उन चर के लिए अलग पहचानकर्ताओं का उपयोग करें - उदा। एक्स 1 और एक्स 2।

+0

फ़ील्ड को अंतिम होने की आवश्यकता नहीं है; यह केवल पैरामीटर/स्थानीय चर के लिए है। अगर उसने बाहरी क्षेत्र 'वाई' कहा जाता है, तो वह इसे सबसे निचले वर्ग से एक्सेस कर सकता है। –

2

सरल उत्तर चर शैडो नहीं करने के लिए है:

public static void main(String[] args) { 
    Comparable c1 = new Comparable() { 
     int x = 3; 
     public int compareTo(Object o) { 
      Comparable c2 = new Comparable() { 
       //changed this name 
       int y = 4; 
       public int compareTo(Object o) { 
        return x; 
       } 
      }; 
      return c2.compareTo(o); 
     } 
    }; 
    System.out.println(c1.compareTo(null)); 
} 

आउटपुट:

यह देखते हुए कि आप उत्पन्न कोड के साथ काम कर रहे हैं, इस के लिए एक विकल्प है आप?

1

AFAIK आपके इच्छित चीजों को हासिल करने का कोई तरीका नहीं है। यदि आप कोड बदल सकते हैं (जैसा कि आप सक्षम होने के लिए प्रतीत होते हैं) लेकिन उन्हें नामित कक्षाओं में बदलना नहीं चाहते हैं, तो क्या आप केवल चर के नाम को बदल सकते हैं ताकि आपके पास स्कोप समस्याएं न हों? आपको उन्हें स्पष्टता के लिए नाम बदलना चाहिए

1

कक्षाएं अज्ञात हैं - नामहीन। नाम संदर्भ का उपयोग कर अपने खेतों तक पहुंचने का कोई तरीका नहीं है। कोई नाम नहीं है

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