Java में नेस्टेड क्लासेस: यह सब कहाँ से शुरू हुआ?
\nकल्पना करें: आप Java में कोड लिख रहे हैं, और अचानक आपको पता चलता है कि एक क्लास तार्किक रूप से दूसरे से अटूट रूप से जुड़ी हुई है। उदाहरण के लिए, Car और Engine। इंजन अपने आप में मौजूद नहीं है - यह कार का हिस्सा है। Java में इसे खूबसूरती और सही तरीके से कैसे मॉडल करें? इसका उत्तर है - नेस्टेड क्लासेस (nested classes)।
Java inner class and static nested class का विषय Stack Overflow पर सबसे आम विषयों में से एक है। हजारों डेवलपर्स भ्रमित होते हैं: क्या अंतर है? inner का उपयोग कब करें, और static nested का कब? इन्हें क्यों बनाया गया?
इस ट्यूटोरियल में हम सब कुछ स्पष्ट रूप से समझाएंगे। आप केवल सिंटैक्स नहीं सीखेंगे - आप Java डिज़ाइनरों के तर्क को समझेंगे। चलिए शुरू करते हैं!
\n\nनेस्टेड क्लास (nested class) क्या है?
\nबुनियादी बातों से शुरू करते हैं। Nested class एक ऐसा क्लास है जो दूसरे क्लास के अंदर घोषित किया जाता है। Java में चार प्रकार के नेस्टेड क्लासेस होते हैं, लेकिन आज हम दो सबसे लोकप्रिय में रुचि रखते हैं:
\n- \n
- Static nested class (स्टैटिक नेस्टेड क्लास) \n
- Inner class (इनर क्लास, जिसे non-static nested class भी कहा जाता है) \n
मुख्य अंतर स्टैटिक मॉडिफायर है। यह सब कुछ बदल देता है: फ़ील्ड तक पहुँच से लेकर ऑब्जेक्ट के जीवनकाल तक। आइए व्यवहार में समझते हैं।
\n\nStatic nested class: सरल और स्वतंत्र
\nस्टैटिक नेस्टेड क्लास एक सामान्य बाहरी क्लास की तरह व्यवहार करता है, लेकिन अपने पैरेंट के अंदर "रहता" है। इसकी बाहरी क्लास के नॉन-स्टैटिक फ़ील्ड और मेथड्स तक पहुँच नहीं होती (जब तक कि इसे ऑब्जेक्ट का रेफरेंस न मिले)।
\n\nवास्तविक दुनिया का उदाहरण: Database और DatabaseConfig। कॉन्फ़िगरेशन डेटाबेस के किसी विशिष्ट इंस्टेंस से बंधा नहीं है।
public class Database {\n private String url;\n private static String defaultDriver = "com.mysql.cj.jdbc.Driver";\n\n public Database(String url) {\n this.url = url;\n }\n\n // Static nested class\n public static class DatabaseConfig {\n private String driver;\n private int poolSize;\n\n public DatabaseConfig(String driver, int poolSize) {\n this.driver = driver;\n this.poolSize = poolSize;\n }\n\n public void printConfig() {\n // केवल बाहरी क्लास के स्टैटिक सदस्यों तक पहुँच है\n System.out.println("Default driver: " + defaultDriver);\n // System.out.println(url); // त्रुटि! url एक नॉन-स्टैटिक फ़ील्ड है\n }\n\n public static void staticMethodInNested() {\n System.out.println("स्टैटिक नेस्टेड क्लास में स्टैटिक मेथड");\n }\n }\n\n public void useConfig() {\n // static nested class का इंस्टेंस बनाना\n DatabaseConfig config = new DatabaseConfig("oracle.jdbc.OracleDriver", 10);\n config.printConfig();\n }\n}\n\nध्यान दें: DatabaseConfig बनाने के लिए हमें Database के ऑब्जेक्ट की आवश्यकता नहीं है। यही मुख्य लाभ है - स्वतंत्रता।
Static nested class का उपयोग कब करें?
\n- \n
- जब नेस्टेड क्लास तार्किक रूप से बाहरी क्लास से जुड़ा हो, लेकिन उसके इंस्टेंस पर निर्भर न हो। \n
- जब सहायक क्लासेस (बिल्डर, कॉन्फ़िग, यूटिलिटी) को समूहित करने की आवश्यकता हो। \n
- जब आप Builder पैटर्न डिज़ाइन कर रहे हों - यह एक क्लासिक उदाहरण है। \n
Inner class (non-static nested class): हमेशा के लिए जुड़े हुए
\nइनर क्लास पूरी तरह से विपरीत है। यह हमेशा बाहरी क्लास के किसी विशिष्ट ऑब्जेक्ट से बंधा होता है। इसका मतलब है:
\n- \n
- इसकी बाहरी क्लास के सभी फ़ील्ड और मेथड्स तक पहुँच होती है (private भी)। \n
- यह बाहरी क्लास के इंस्टेंस के बिना मौजूद नहीं रह सकता। \n
- यह अंतर्निहित रूप से बाहरी ऑब्जेक्ट का रेफरेंस संग्रहीत करता है (
OuterClass.this)। \n
उदाहरण: Car और Engine। हर कार