2013-04-09 6 views
11

मैं एक सहायक वर्ग बनाना चाहता हूं जो फ़ॉर्मेटिंग से संबंधित है (यानी विराम चिह्न को हटाने और प्रकारों के बीच रूपांतरित करने के साथ-साथ नामों को दोबारा बदलने के तरीके भी हैं)। ऐसा प्रतीत नहीं होता है कि इसे किसी भी फ़ील्ड की आवश्यकता होगी - इसका एकमात्र उद्देश्य पारित चीजों को परिवर्तित करने और उन्हें वापस करने के लिए, सुधारित करना है। क्या एक कन्स्ट्रक्टर छोड़ना बुरा व्यवहार है? यदि हां, तो मेरा कन्स्ट्रक्टर क्या कर रहा है? मैं this link पर देख रहा था और देखा कि जिस वर्ग में इसका वर्णन किया गया है वह एक निर्माता का अभाव है।जावा - क्या यह खराब अभ्यास है कि क्लास कन्स्ट्रक्टर न हो?

उत्तर

39

यह बुरा व्यवहार एक निर्माता बाहर छोड़ने के लिए है?

हाँ - क्योंकि जब तक आप किसी भी कंस्ट्रक्टर्स निर्दिष्ट करते हैं, जावा कम्पाइलर आप वर्ग को उसी दृश्यता के साथ एक निर्माता दे देंगे।

मान लिया जाये कि सभी अपने तरीके स्थिर कर रहे हैं - जो संभावना लगती है, जब तक आप बहुरूपता चाहते हैं - आप अपनी कक्षा final बनाने के लिए और यह एक private निर्माता देना चाहिए, ताकि अन्य डेवलपर्स नहीं गलती से कर अपने वर्ग का एक उदाहरण बनाने के लिए, जब वह व्यर्थ होगा। जब एक एपीआई के बारे में सोच, किसी भी समय मैं क्षमता डेवलपर्स के लिए कुछ बेवकूफ ऐसा करने के लिए निकाल सकते हैं, मैं ऐसा :)

तो जैसे कुछ:

public final class Helpers { 
    private Helpers() { 
    } 

    public static String formatDate(Date date) { 
     // etc 
    } 
} 

ध्यान दें कि समीकरण से बहुरूपता लेने के द्वारा, आप परीक्षणों के लिए इस व्यवहार को बदलने की संभावना को भी हटा रहे हैं। यह ठीक हो सकता है - मैं "कोई स्थिरता, कभी नहीं" में विश्वास नहीं कर रहा हूं - लेकिन यह विचार करने योग्य है।

+0

+1 निजी कन्स्ट्रक्टर की सिफारिश के लिए +1। –

+2

मैंने कुछ सीखा :) – kishu27

+0

धन्यवाद! मैंने कभी (जावा के साथ अपने बहुत संक्षिप्त अनुभव में) एक निजी कन्स्ट्रक्टर को पहले कभी नहीं देखा है, इसलिए यह भी दिलचस्प और सहायक है। –

5

कोई भी वर्ग जिसमें सभी विधियों की आवश्यकता नहीं है या किसी भी राज्य की आवश्यकता नहीं है कन्स्ट्रक्टर निजी बनाकर कन्स्ट्रक्टर की दृश्यता को कम करने के लिए स्वतंत्र है।

उदाहरण java.lang.Math जावा में कक्षा।

java.lang.Math रूप सभी स्थैतिक तरीकों जो अपने वर्ग के रूप में इसी तरह के काम करते हैं वे इतनी है कि कोई भी गलती से उस वर्ग के उदाहरण बना सकते हैं private के रूप में निर्माता की घोषणा कर दी है।

/** 
    * Don't let anyone instantiate this class. 
    */ 
    private Math() {} 
3

बुरा व्यवहार नहीं है। लेकिन आपके द्वारा दिए गए उदाहरण में कोई सदस्य चर नहीं है जिसका उपयोग किसी ऑब्जेक्ट संदर्भ में किया जा सकता है। ऐसी परिस्थितियों में, स्थिर विधियों के लिए सबसे अच्छा है क्योंकि तब आपको विधियों को कॉल करने से पहले कक्षा के लिए ऑब्जेक्ट बनाने के लिए स्मृति आवंटित करने की आवश्यकता नहीं है।

-2

आमतौर पर यह कक्षा में आपके कन्स्ट्रक्टर को परिभाषित करने के लिए एक अच्छा कोडिंग अभ्यास है हालांकि प्रत्येक वर्ग में एक डिफ़ॉल्ट कन्स्ट्रक्टर होता है।

लेकिन अगर आपके पास ओवलोडेड कन्स्ट्रक्टर का उपयोग करने या किसी भी सिंगलटन पैटर्न को बनाने की कोई विशेष आवश्यकता नहीं है तो आप कन्स्ट्रक्टर को हटा सकते हैं।

यदि आप अपने मामले में स्थिर तरीकों का उपयोग कर रहे हैं तो आपको कन्स्ट्रक्टर को परिभाषित करने की कोई आवश्यकता नहीं है, क्योंकि आपको इस वर्ग की वस्तु रखने की आवश्यकता नहीं है।

1

कंपाइलर आपके लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर (कोई पैरामीटर नहीं) उत्पन्न करेगा।यदि आपकी कक्षा ने कक्षा को विस्तारित नहीं किया है और प्रारंभिक आवश्यकता की आवश्यकता नहीं है, तो आप इसे स्पष्ट कन्स्ट्रक्टर

1

कोई कन्स्ट्रक्टर छोड़ने के लिए अच्छा नहीं है क्योंकि आपकी कक्षा में कोई इंस्टेंस चर नहीं है!

रचनाकारों का उदाहरण आवृत्ति चर शुरू करने के लिए है!

अभी भी अगर आप कन्स्ट्रक्टर को छोड़ते हैं, तो कंपाइलर किसी भी तरह से डिफॉल्ट कन्स्ट्रक्टर को सम्मिलित करता है जो काफी उचित है !!

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