2015-03-01 4 views
5

आंतरिक कक्षा के बारे में सीखने के बाद, मुझे लगता है कि यह बाहरी वर्ग का एक अंतर्निहित संदर्भ है।इनर क्लास में बाहरी वर्ग का एक निहित संदर्भ है और यह स्मृति को रिसाव कर सकता है

लेकिन मेरे शिक्षक ने मुझे बताया कि सबसे अच्छा तरीका आंतरिक वर्ग का उपयोग नहीं करना है, स्थिर आंतरिक कक्षा का उपयोग करना पसंद करते हैं। क्योंकि आंतरिक वर्ग स्मृति को रिसाव कर सकता है।

क्या कोई इस बारे में कृपया समझा सकता है?

+3

http://stackoverflow.com/questions/10864853/when-exactly-is-it-leak-safe-to-use-anonymous-inner-classes – jas

+0

@jas धन्यवाद, लेकिन मैं अभी भी इसके बारे में बहुत भ्रमित हूं। मैं कम स्कोर की वजह से उस समाधान के तहत टिप्पणी नहीं कर सकता। समाधान में, यह कहा गया, "यह एकमात्र तरीका हो सकता है यदि युक्त वर्ग के बाहर कोई वस्तु आंतरिक वस्तु के संदर्भ में आंतरिक वस्तु का संदर्भ रखती है।" यह कैसे हो सकता है, अगर हम आंतरिक कक्षा तक पहुंच प्राप्त करना चाहते हैं, तो हमें बाहरी का उपयोग करना चाहिए। सही अधिकार? यह युक्त वर्ग के बाहर किसी ऑब्जेक्ट को कोई समझ नहीं आता है, जिसमें ऑब्जेक्ट के संबंध में आंतरिक वस्तु का संदर्भ रहता है – Jie

उत्तर

5

आपकी टिप्पणी के जवाब में (अगर मैं इसे टिप्पणियों में पोस्ट करता हूं तो यह पढ़ा जा सकता है), जहां यह संबंधित है। बाहरी के बाहर भीतरी कक्षा को accesing का उदाहरण। अपने कोड में किसी और

public class Dog { 
    String name; 
} 

public class HugeKennel { 
    Double[] memmoryWaste = new Double[10000000]; 


    public List<Dog> getDogs() { 
     SneakyDog trouble = new SneakyDog("trouble"); 
     return Arrays.asList(trouble); 
    } 

    class SneakyDog extends Dog { 
     SneakyDog(String name) { 
      this.name = name; 
     } 
    } 

} 

कहीं

List<Dog> getCityDogs() { 
    List<Dog> dogs = new ArrayList<>(); 
    HugeKennel k1 = ... 
    dogs.addAll(k1.getDogs()); 
    HugeKennel k2 = ... 
    dogs.addAll(k2.getDogs()); 
    return dogs; 
} 

.... 

List<Dog> cityDogs = getCityDogs(); 
for (Dog dog: dogs) { 
    walkTheDog(dog); 
} 
// even though the Kenels were local variables in of getCityDogs(), they cannot be removed from the memory, as the SneakyDogs in the list are still referencing their parent kennels. 
//from now on, until all the dogs are not disposed off, the kennels also have to stay in the memory. 

तो तुम अपने Parrent वर्ग के माध्यम से आंतरिक वर्ग का उपयोग करने की जरूरत नहीं है, एक बार आंतरिक वस्तु बनाई गई है यह किसी भी अन्य वस्तु के रूप में इस्तेमाल किया जा सकता है और उपरोक्त उदाहरण में, जैसे कि कुत्ते की सूची कुत्तों के संदर्भ रखेगी, लेकिन प्रत्येक कुत्ता अभी भी अपने केनेल के बारे में 'जान' रखेगा, इसके कंटेनर वर्ग के बाहर 'लीक किया जा सकता है'।

स्टैकट्रेस से जुड़ा हुआ उदाहरण सामान्य उपयोग के मामले से संबंधित था, जब आंतरिक कक्षाएं अज्ञात आंतरिक कक्षाओं के रूप में 'विज्ञापन हॉक' बनाई जाती हैं, लेकिन यह वही समस्या है। यदि आप किसी भीतरी कक्षा के किसी भी उदाहरण के संदर्भ को पास करते हैं, तो आप बाहरी वर्ग के संदर्भ में 'पासिंग' भी कर रहे हैं।

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