2011-01-27 10 views
14

यह इस सूत्र में उपलब्ध कराई गई एक प्रश्न के मेरा उत्तर के संबंध में है: Are Inner Classes lightweight?एक गुमनाम आंतरिक वर्ग के एक से अधिक उदाहरण फिर से

मैं अपने पढ़ने से याद रखें कि यदि आप केवल एक ही गुमनाम से एक वस्तु बना सकते हैं आंतरिक वर्ग, और इस कारण से, यदि आप कहना चाहते हैं कि ActionListener वर्ग बनाएं और अज्ञात आंतरिक वर्ग का उपयोग न करने के लिए, बल्कि एक निजी आंतरिक वर्ग या स्टैंड के लिए, इस वर्ग (प्रतिबिंब का उपयोग नहीं) से कई ऑब्जेक्ट्स बनाना चाहते हैं कक्षा के साथ, लेकिन लोग मुझे बता रहे हैं कि मैं गलत हूं। क्या कोई इसे मेरे लिए स्पष्ट कर सकता है? कृपया लिंक देखें क्योंकि इसमें अधिक जानकारी है, लेकिन अगर कुछ अस्पष्ट है, तो कृपया पूछें!

+0

धन्यवाद, मुझे लगता है कि मुझे लगता है कि समझते हैं, लेकिन यह कई वर्गों बनाने की आवश्यकता होगी - अगर मैं सही ढंग से समझ। सवाल एक अज्ञात आंतरिक वर्ग के लिए कोड दिया गया है, क्या आप इसकी वस्तुओं के कई उदाहरण बना सकते हैं? और मेरा मतलब यह नहीं है कि एक लूप का उपयोग करना, फिर से, यह कई वर्गों का निर्माण करेगा --- ओह, आपकी टिप्पणी कहां जाएगी? –

+1

मुझे लगता है कि आप अपनी कक्षा के कई उदाहरणों का मतलब है? एक ऑब्जेक्ट स्वयं में एक उदाहरण है –

+1

@ होवरक्राफ्ट, टिप्पणियों में पठनीय कोड नहीं डाल सकता है। ;) –

उत्तर

16

आप गुमनाम वर्ग वस्तुओं के किसी भी नंबर बना सकते हैं, तो आप उन्हें अपने कोड में एक ही स्थान पर बना सकते हैं (जब तक आप कोड को कॉपी)

ExecutorService service = ... 
for(int i=0;i<1000*1000;i++) { 
    final int finalI = i; 
    service.submit(new Runnable() { 
     public void run() { 
     System.out.println("Task "+finalI+" run."); 
     } 
    }); 
} 

इस कोड को एक ही कक्षा के 1 लाख वस्तुओं का निर्माण करेगा।

+0

"यह कोड एक ही कक्षा के 1 मिलियन ऑब्जेक्ट्स बनाएगा।" यह वह जगह है जहां मैं उलझन में हूं। क्या यह एक लाख वर्ग नहीं बनायेगा, प्रत्येक एक उदाहरण के साथ? यह प्रश्न का क्रूक्स है। –

+0

मुझे काम पर वापस जाना है :(, लेकिन कुछ इस चर्चा में वापस आ जाएगा घंटे। सभी के लिए, किसी भी और सभी इनपुट के लिए धन्यवाद !!! –

+4

@ होवरक्राफ्ट पूर्ण ईल्स नहीं, केवल एक * वर्ग * बनाया गया है। यह वर्ग हास्यास्पद नाम * बाइट-कोड * में बेक्ड है। (जावा सिर्फ आपकी तरफ से * नामित * आंतरिक वर्ग बनाने का गंदा बिट है और यह सुनिश्चित कर रहा है कि यह बनाए गए संदर्भ में सेटअप हो)। नया * इंस्टेंस * को छोड़कर, प्रकार को अच्छी तरह से एक्सेस करने का कोई तरीका नहीं है " परिणाम "अज्ञात वर्ग घोषणा का। –

4

यह मेरे लिए अस्पष्ट नहीं है। शायद अगर हम चश्मा के माध्यम से कंघी करते हैं तो हमें सबूत मिलेंगे कि आंतरिक वर्गों को सामान्य कक्षाओं के समान माना जाना चाहिए। हालांकि भावना में, एक आंतरिक वर्ग बाहरी उदाहरण पर निर्भर करता है, कक्षा उदाहरण से परे मौजूद नहीं है। यह "सामान्य" वर्गों से अलग है जिसका अस्तित्व मूल रूप से शाश्वत है। पाठ्यक्रम के दो बाहरी उदाहरणों के दो आंतरिक वर्ग एक दूसरे से संबंधित हैं, एक ही स्रोत कोड द्वारा बनाए जा रहे हैं, फिर भी इसका मतलब यह नहीं है कि वे समान या बराबर होना चाहिए।

इस बात का प्रमाण है कि जावा डिजाइनर इस तरह से इरादा रखते हैं कि आत्मा में एक आंतरिक वर्ग बाहरी उदाहरण के दायरे में रहता है। उदाहरण के लिए, उत्सुक वाक्यविन्यास outerInstance.new InnerClass()। उदाहरण के लिए, कोई स्थैतिक चर नहीं, आंतरिक कक्षाओं के लिए कोई स्थिर प्रारंभकर्ता नहीं। कक्षा अनलोडिंग [1] की चर्चा में, हम देखते हैं कि तर्क वास्तव में आंतरिक कक्षाओं पर लागू नहीं होता है, यह कल्पना की जा सकती है कि आंतरिक कक्षाओं को उतार दिया जा सकता है! यह कल्पना की जा सकती है कि एक वीएम प्रत्येक नए बाहरी उदाहरण के लिए एक नई आंतरिक कक्षा बनाता है।

व्यावहारिक रूप से यह मामला नहीं है, आंतरिक वर्गों को वास्तव में सामान्य कक्षाओं के समान माना जाता है। लेकिन अवधारणात्मक रूप से, मैं हमेशा उनके बारे में अलग-अलग सोचूंगा, उदाहरण के लिए-निजी वर्ग।

[1] http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.7

अद्यतन: करने के लिए [2]

दो संदर्भ प्रकार एक ही रन-टाइम प्रकार के होते हैं, तो वे ... एक ही द्विआधारी नाम

है अनुसार

और [3]

अज्ञात वर्ग (§15.9.5) का बाइनरी नाम शामिल है इसके तत्काल संलग्न प्रकार का बाइनरी नाम, उसके बाद $ के बाद, अंकों के एक खाली खाली अनुक्रम के बाद।

तो एक अज्ञात वर्ग में एक बाइनरी नाम है, इसलिए केवल एक रन-टाइम प्रकार है। Spec हमें गारंटी देता है कि एक अज्ञात वर्ग के विभिन्न उदाहरणों में पहचान वर्ग है।

[2] http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.4

[3] http://java.sun.com/docs/books/jls/third_edition/html/binaryComp.html#44909

+0

जानकारी और संदर्भ के लिए धन्यवाद! –