एक बिल्डर को अपनी कक्षा की फाइल के बजाय एक आंतरिक वर्ग क्यों होना चाहिए?


24

कई Builder Patternउदाहरण Builderवस्तु का एक आंतरिक वर्ग बनाते हैं जो इसे बनाता है।

यह कुछ समझ में आता है क्योंकि यह इंगित करता है कि क्या Builderबनाता है। हालाँकि, एक वैधानिक रूप से टाइप की गई भाषा में हम जानते हैं कि क्या Builderबनता है।

दूसरी ओर यदि Builderकोई आंतरिक वर्ग है, तो आपको पता होना चाहिए कि किस वर्ग का Builderनिर्माण बिना अंदर देखे हुए होता है Builder

इसके अलावा, एक आंतरिक वर्ग के रूप में बिल्डर होने से आयात की संख्या कम हो जाती है क्योंकि इसे बाहरी वर्ग द्वारा संदर्भित किया जा सकता है - यदि आप इस बारे में परवाह करते हैं।

और फिर ऐसे व्यावहारिक उदाहरण हैं जहां Builderएक ही पैकेज में है, लेकिन एक आंतरिक वर्ग नहीं है, जैसे StringBuilder। आप जानते हैं कि निर्माण Builder करना चाहिएString क्योंकि इसे नाम दिया गया है।

यह कहा जा रहा है, Builderएक आंतरिक वर्ग बनाने के लिए केवल एक ही अच्छा कारण है जिसके बारे में मैं सोच सकता हूं कि आप जानते हैं कि वर्ग ' Builderका नाम जाने बिना या नामकरण परंपराओं पर निर्भर है। उदाहरण के लिए, अगर मैं StringBuilderभीतर का वर्ग Stringहोता तो शायद मुझे पता होता कि मैं (सट्टा) की तुलना में जल्द ही मौजूद हूं।

क्या Builderआंतरिक वर्ग बनाने के लिए कोई अन्य कारण हैं या यह सिर्फ वरीयता और अनुष्ठान के लिए नीचे आता है?

जवाबों:


30

मुझे लगता है कि ऐसा करने का कारण यह है कि आंतरिक वर्ग (बिल्डर) उस वर्ग के निजी सदस्यों तक पहुंच बना सकता है जो यह निर्माण कर रहा है।

से http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

गैर-स्थैतिक नेस्टेड कक्षाएं (आंतरिक कक्षाएं) को संलग्न करने वाले वर्ग के अन्य सदस्यों तक पहुंच है, भले ही वे निजी घोषित किए गए हों।

...

दो शीर्ष-स्तरीय कक्षाओं, ए और बी पर विचार करें, जहां बी को ए के सदस्यों तक पहुंच की आवश्यकता है जो अन्यथा निजी घोषित किए जाएंगे। कक्षा बी को कक्षा ए के भीतर छिपाकर, ए के सदस्यों को निजी घोषित किया जा सकता है और बी उन्हें एक्सेस कर सकते हैं।

...

उदाहरण के तरीकों और चर के साथ, एक आंतरिक वर्ग अपने संलग्न वर्ग की एक आवृत्ति के साथ जुड़ा हुआ है और उस वस्तु के तरीकों और क्षेत्रों तक सीधी पहुंच है।

इसका वर्णन करने के लिए यहां कुछ कोड दिए गए हैं:

class Example {

    private int x;

    public int getX() { return this.x; }

    public static class Builder {

        public Example Create() {
            Example instance = new Example();
            instance.x = 5; // Builder can access Example's private member variable
            return instance;
        }
    }
}

एक स्थिर वर्ग के रूप में, बिल्डर के पास उदाहरण का कोई विशिष्ट उदाहरण नहीं है कि वह किससे बंधा है। हालाँकि, उदाहरण का एक उदाहरण दिया (या जो इसे स्वयं बनाता है) बिल्डर अभी भी उस उदाहरण के निजी सदस्यों तक पहुंच सकता है।


महान जवाब, यह समझ में आता है! हालाँकि बिल्डर पैटर्न में आमतौर पर एक स्थिर आंतरिक वर्ग होता है और यह केवल बाहरी वर्ग के स्थिर निजी सदस्यों तक ही पहुँच बना सकेगा। यदि आपके पास एक तात्कालिक वर्ग के लिए एक बिल्डर था जो सभी प्रकार के अजीब होगा।
नथानियल

1
@ नॉटिअल बिल्कुल भी नहीं, निजी उदाहरण चर भी सुलभ हैं: ideone.com/7DyjDR
amon

1
@ नथनियल: हाँ, लेकिन बिल्डर वर्ग में हेरफेर नहीं कर रहा है; यह उस वर्ग की एक वस्तु में हेरफेर कर रहा है जिसे बिल्डर ने तुरंत चालू कर दिया है।
रॉबर्ट हार्वे

@ मैं आपको देखता हूं कि आपने वहां क्या किया। स्पष्टीकरण के लिए धन्यवाद!
नाथनियल

विशेष रूप से, यह बिल्डर को निर्मित किए जा रहे वर्ग के लिए एक निजी निर्माणकर्ता तक पहुंच प्रदान करता है, जिससे उस वर्ग को अपरिवर्तनीय (सभी क्षेत्रों के लिए अंतिम) और बिल्डर के माध्यम से केवल तुरंत उपयोग करने की अनुमति मिलती है।
मैथ्यू मैकपेक

1

इस मामले में कोई "चाहिए" नहीं है। किसी अन्य वर्ग के अंदर एक बिल्डर को परिभाषित करना या इसे अलग करना बिल्डर पैटर्न के लिए रूढ़िवादी है। कई उदाहरण एक सुसंगत फ़ाइल में कोड पेश करने की सुविधा के कारण भी करते हैं (निजी सदस्यों तक पहुंचने के लिए लेकिन यह संदर्भ के साथ भी निर्भर करता है)। बेझिझक अन्यथा करें


निश्चित रूप से इस जवाब को वोट नहीं दिया गया था कि किसी अन्य कारण से, "क्योंकि हम जावा में ऐसा नहीं करते हैं।" बिल्डर पैटर्न एक कंस्ट्रक्टर के चारों ओर एक आवरण प्रदान करता है जो मापदंडों का एक गुच्छा लेता है। यदि निर्माता उन मापदंडों को लेता है, तो निजी सदस्यों तक पहुंचने के लिए बिल्डर ऑब्जेक्ट की आवश्यकता नहीं है।
ग्रेग बरगार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.