2012-07-24 20 views
11

में निजी कन्स्ट्रक्टर जावा में निजी कन्स्ट्रक्टर का उपयोग करने का उद्देश्य क्या है?अमूर्त वर्ग

एक समीक्षा में मुझे यह प्रश्न मिला, और मैं उत्सुक हूं, इस तरह से कन्स्ट्रक्टर का उपयोग करने के लिए किस स्थिति की आवश्यकता है?

मुझे लगता है कि इसे अमूर्त वर्ग में किसी अन्य निर्माता के साथ जोड़ा जा सकता है, लेकिन यह बहुत छोटा है। इसके अलावा इसका उपयोग स्थिर आंतरिक कक्षाओं के निर्माण के लिए भी किया जा सकता है जो अमूर्त वर्ग का विस्तार करेगा।

शायद अधिक सुरुचिपूर्ण उपयोग है?

+0

मैंने इस प्रश्न पर वोट नहीं दिया लेकिन मुझे संदेह है कि लोगों को कम करने का असर पड़ रहा है * शायद "अधिक सुंदर उपयोग है" * - यह काफी व्यापक है और काफी उदारतापूर्ण लगता है। – Flexo

+2

सवाल यह है: * "जावा में अमूर्त वर्ग में निजी कन्स्ट्रक्टर का उपयोग करने का उद्देश्य क्या है?" *। यह मेरे लिए काफी विशिष्ट लगता है। उत्तर के लिए – assylias

+0

Thx, शायद आप सही हैं। – Chris

उत्तर

27

private निर्माता वर्ग के केवल निर्माता है, तो कारण स्पष्ट है। कुछ वर्ग केवल स्थैतिक क्षेत्रों/विधियों के लिए धारकों के रूप में कार्य करते हैं और या तो तत्काल या उप-वर्गीकृत नहीं होना चाहते हैं। ध्यान दें कि abstract संशोधक इस मामले में अनावश्यक — है या इसके बिना कोई तत्काल संभव नहीं होगा। जैसा कि @ जेबी निजेट नीचे नोट करता है, abstract संशोधक भी खराब अभ्यास है क्योंकि यह कक्षा के ग्राहकों को गलत सिग्नल भेजता है। कक्षा वास्तव में final होनी चाहिए।

एक और उपयोग के मामले, बहुत दुर्लभ है, हालांकि: आपको लगता है कि अपने स्वयं के उपवर्गों के रूप में नेस्टेड कक्षाओं में शामिल केवल private कंस्ट्रक्टर्स के साथ एक abstract class हो सकता है। यह मुहावरे सुनिश्चित करता है कि उन नेस्टेड कक्षाएं केवल उप-वर्ग हैं। वास्तव में, जावा में enum एस सिर्फ इस मुहावरे का उपयोग करते हैं।

यदि आसपास के अन्य रचनाकार हैं, तो private कन्स्ट्रक्टर के बारे में वास्तव में कुछ खास नहीं है।यह abstract कक्षा में किसी अन्य के रूप में उपयोग किया जाता है।

+0

मैं कहूंगा कि इस मामले में सार का उपयोग न केवल अनावश्यक है, बल्कि भ्रमित है। परिभाषा के अनुसार, एक अमूर्त वर्ग, * मतलब * subclassed होने के लिए है। एक वर्ग सार बनाना, लेकिन उप-वर्गीकरण योग्य नहीं, यह समझने की कमी दर्शाता है कि किस सार के लिए है। –

+0

@JBNizet जरूरी समझ की कमी नहीं है, लेकिन शायद देखभाल की कमी आपके ग्राहकों को भ्रमित न करें। बीटीडब्ल्यू ने अपना दूसरा पैराग्राफ नोट किया है जिसे मैंने अभी जोड़ा है। यह 'अमूर्त' वर्ग में 'निजी' सीटीओआर के लिए सही प्रेरणा देता है। –

+2

अच्छा बिंदु। लेकिन मैं उलझा हुआ ;-) –

0

कोई अन्य सुरुचिपूर्ण उपयोग संभव है

6

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

2

कभी-कभी, डिफ़ॉल्ट नो-Arg कन्स्ट्रक्टर निजी बना दिया जाता है, और दूसरा कन्स्ट्रक्टर जो तर्क स्वीकार करता है प्रदान किया जाता है। यह कन्स्ट्रक्टर तब अन्य निजी कन्स्ट्रक्टर (ओं) का आह्वान कर सकता है। यह इन तर्कों को आपूर्ति करने के लिए कार्यान्वयन को बल देता है, जो सुनिश्चित कर सकता है कि कुछ चर हमेशा प्रारंभ किया जाता है, हालांकि यह सामान्य अभ्यास नहीं है (मेरे अनुभव में)। यदि यह आवश्यकता है, तो आप अपने चर की जांच करने और IllegalArgumentExeption फेंकने से बेहतर होंगे, यह बताते हुए कि चर को प्रारंभ करने की आवश्यकता क्यों है।

यदि आप केवल निजी रचनाकारों के साथ एक सार वर्ग बनाते हैं, तो वर्ग व्यावहारिक रूप से बेकार है क्योंकि कोई भी उदाहरण कभी भी नहीं बनाया जा सकता है। यदि इरादा केवल स्थिर तरीकों (Math वर्ग java.lang पैकेज में) के साथ उपयोगिता वर्ग बनाना है, तो निजी रचनाकार स्वीकार्य हैं, हालांकि कक्षा को सार के रूप में चिह्नित करने के लिए कक्षा को अंतिम रूप में चिह्नित किया जाना चाहिए, यह दर्शाता है कि वर्ग होना चाहिए बढ़ाया।

+2

हालांकि, अगर आप स्पष्ट रूप से केवल एक कन्स्ट्रक्टर प्रदान करते हैं, तो कोई डिफ़ॉल्ट नो-Arg कन्स्ट्रक्टर नहीं है, इसलिए यह वास्तव में इसे निजी बनाने का कारण नहीं है। – Thilo

1
  1. जैसा कि उल्लेख किया गया है, एक सामान्य, आंतरिक उपयोग केवल कन्स्ट्रक्टर के रूप में उपयोग किया जाना है।

  2. सार या सार नहीं, कक्षा को तुरंत रोकने के लिए केवल स्थिर सार्वजनिक विधियों [सहायक विधियों] वाले वर्ग पर एक निजी डिफ़ॉल्ट कन्स्ट्रक्टर घोषित करना असामान्य नहीं है। उपवर्गीकरण को रोकने के लिए:

+0

@ थिलो - मैं सहमत हूं (3) लागू नहीं होता है, मुझे ले जाया गया - यह एक विस्तार होगा (1)। 4 यह स्पष्ट करने के लिए योग्य है कि यह विशिष्ट प्रश्न पर सीधे लागू नहीं है। –

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