2009-12-22 25 views
18

निम्न उदाहरण लें:जावा अंतिम स्थानीय चर कहाँ संग्रहीत हैं?

public void init() { 
    final Environment env = new Environment(); 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      env.close(); 
     } 
    }); 
} 

सबसे पहले, env कहां संग्रहीत है? क्या यह है:

  • कंपाइलर द्वारा आंतरिक कक्षा के एक छिपे हुए सदस्य चर में प्रतिलिपि बनाई गई है जो संदर्भित करता है कि
  • प्रतिलिपि बनाई गई है, और ढेर पर
  • ढेर पर संदर्भित है और किसी भी तरह से संदर्भित
  • कुछ और

मेरा अनुमान पहला विकल्प है।

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

उत्तर

18

हां, उनकी प्रतिलिपि बनाई गई है, यही कारण है कि आपको चर को अंतिम के रूप में घोषित करना होगा। इस तरह, प्रतिलिपि बनाने के बाद उन्हें बदलने की गारंटी नहीं है।

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

private Environment env; // a field does not have to be final 

public void init() { 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      env.close(); 
     } 
    }); 
} 

दूसरे, किसी भी प्रदर्शन के मुद्दों है कि ऐसा करने से उत्पन्न होती हैं करते हैं?

क्या तुलना में? आपको अपनी आंतरिक कक्षा के काम के लिए चारों ओर क्षेत्र या चर होना चाहिए, और एक प्रति एक बहुत ही कुशल तरीका है। यह वैसे भी एक "उथला" प्रतिलिपि है: केवल संदर्भ (आपके उदाहरण में) पर्यावरण की प्रतिलिपि बनाई गई है, पर्यावरण ही नहीं।

+0

तो क्या मुझे लगता है कि ऐसा करने से उत्पन्न कोई प्रदर्शन समस्या नहीं है? – Joel

+0

इस क्षेत्र में मेरा निजी पालतू शिखर यह है कि बाहरी उदाहरण के संदर्भ (खेतों तक पहुंचने के लिए उपयोग किए जाने वाले चर, चर नहीं हैं) एक समस्या हो सकती है, यदि उनकी आवश्यकता नहीं है: http://stackoverflow.com/questions/ सदस्य चर के रूप में संदर्भित करने की तुलना में 758570/यह संभव-से-बना-अज्ञात-आंतरिक-कक्षा-इन-जावा-स्थिर – Thilo

+0

है। यदि इसकी प्रतिलिपि बनाई गई है, तो, मेरी धारणा यह है कि कोई प्रदर्शन प्रभाव नहीं है। – Joel

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