जावा में एक कंस्ट्रक्टर से दूसरे कंस्ट्रक्टर को कैसे कॉल करें: हुड के नीचे विश्लेषण

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जावा में एक कंस्ट्रक्टर से दूसरे कंस्ट्रक्टर को कैसे कॉल करें: गैर-स्पष्ट विवरण जो आपके कोड को बदल देंगे

\n\n

क्या आपने कभी 5-6 कंस्ट्रक्टर वाला Java क्लास लिखा है और महसूस किया है कि आप कोड डुप्लिकेशन में डूब रहे हैं? या, इसके विपरीत, किसी और के कोड को देखा है जहाँ रहस्यमय this(name, 0, true) दिखाई देता है और सोचा है: "यह क्या जादू है?"।

\n\n

प्रश्न "How do I call one constructor from another in Java?" Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है (हज़ारों व्यू और सैकड़ों उत्तर)। और यह कोई संयोग नहीं है। एक सरल ऑपरेशन प्रतीत होने वाला कंस्ट्रक्टर कॉल, अपने आप में कई बारीकियाँ छिपाए होता है जो प्रदर्शन, पठनीयता और यहाँ तक कि प्रोग्राम की शुद्धता को भी प्रभावित करती हैं।

\n\n

इस लेख में, हम केवल सिंटैक्स नहीं दिखाएंगे। हम JVM के हुड के नीचे झाँकेंगे, समझेंगे कि कंपाइलर ऐसे कॉल को कैसे संभालता है, और व्यावहारिक सुझाव देंगे जो शुरुआती और अनुभवी डेवलपर दोनों के लिए उपयोगी होंगे।

\n\n

कंस्ट्रक्टर से कंस्ट्रक्टर क्यों कॉल करें? डुप्लिकेशन की समस्या

\n\n

कल्पना करें कि आप एक User क्लास लिख रहे हैं, जिसमें अनिवार्य फ़ील्ड (नाम, ईमेल) और वैकल्पिक फ़ील्ड (आयु, फ़ोन) हैं। आप अपने API के उपयोगकर्ताओं को लचीलापन देना चाहते हैं: न्यूनतम डेटा के साथ या सभी विवरणों के साथ ऑब्जेक्ट बनाना।

\n\n

खराब तरीका (कंस्ट्रक्टर कॉल के बिना):

\n
public class User {\n    private String name;\n    private String email;\n    private int age;\n    private String phone;\n\n    public User(String name, String email) {\n        this.name = name;\n        this.email = email;\n        this.age = 0;        // डिफ़ॉल्ट मान\n        this.phone = null;   // डिफ़ॉल्ट मान\n    }\n\n    public User(String name, String email, int age) {\n        this.name = name;\n        this.email = email;\n        this.age = age;\n        this.phone = null;   // फिर से डुप्लिकेशन\n    }\n\n    public User(String name, String email, int age, String phone) {\n        this.name = name;\n        this.email = email;\n        this.age = age;\n        this.phone = phone;\n    }\n}
\n\n

यहाँ हम तीन बार name और email असाइन कर रहे हैं। एक नया फ़ील्ड जोड़ने पर सभी कंस्ट्रक्टर को संपादित करना होगा। यह DRY (Don't Repeat Yourself) सिद्धांत का उल्लंघन करता है और त्रुटियों के जोखिम को बढ़ाता है।

\n\n

अच्छा तरीका (this() के माध्यम से कंस्ट्रक्टर कॉल के साथ):

\n
public class User {\n    private String name;\n    private String email;\n    private int age;\n    private String phone;\n\n    public User(String name, String email) {\n        this(name, email, 0, null);  // सबसे "पूर्ण" कंस्ट्रक्टर को डेलिगेट करें\n    }\n\n    public User(String name, String email, int age) {\n        this(name, email, age, null); // फिर से डेलिगेशन\n    }\n\n    public User(String name, String email, int age, String phone) {\n        this.name = name;\n        this.email = email;\n        this.age = age;\n        this.phone = phone;\n    }\n}
\n\n

अब सभी इनिशियलाइज़ेशन लॉजिक एक कंस्ट्रक्टर में है। बाकी बस उसे काम सौंपते हैं, डिफ़ॉल्ट मान पास करते हैं। यह संक्षिप्त है, बनाए रखना आसान है, और फ़ील्ड को भूलने की संभावना कम है।

\n\n

कंस्ट्रक्टर कॉल का सिंटैक्स: this() और super()

\n\n

जावा में कंस्ट्रक्टर को कॉल करने के लिए दो कीवर्ड हैं:

\n
    \n
  • this(पैरामीटर) — उसी क्लास के दूसरे कंस्ट्रक्टर को कॉल करता है।
  • \n
  • super(पैरामीटर) — पैरेंट क्लास के कंस्ट्रक्टर को कॉल करता है।
  • \n
\n\n

सबसे महत्वपूर्ण नियम: this() या super() का कॉल कंस्ट्रक्टर में पहला स्टेटमेंट होना चाहिए। क्यों? इसके बारे में थोड़ी देर बाद।

\n\n

इनहेरिटेंस के साथ उदाहरण:

\n
class Animal {\n    private String species;\n\n    public Animal(String species) {\n        this.species = species;\n        System.out.println("Animal constructor: " + species);\n    }\n}

ब्लॉग

पुस्तक अनुशंसाएँ