आपने हाल ही में सिंगलटन डिज़ाइन पैटर्न , जावा में इसे कैसे लागू किया जाए, और इसके लिए क्या है, में गहन अध्ययन किया है। लेकिन क्या होगा अगर मैं आपको बताऊं कि जावा बॉक्स से बाहर अपने सिंगलटन के साथ आता है? साजिश हुई? तो चलो गोता लगाएँ।

आप शायद Enum वर्ग के बारे में पहले से ही जानते हैं । इसकी एक खास विशेषता है जिससे आपको अवगत होना चाहिए। विशेष रूप से, Enum सिंगलटन डिज़ाइन पैटर्न को लागू करता है। यह विकल्प लगभग एक सार्वजनिक क्षेत्र से जुड़े सिंगलटन दृष्टिकोण के समान है ।

सिंगलटन एनम के रूप में:


public enum Device {   
    PRINTER	
} 
    

सिंगलटन एक सार्वजनिक चर के रूप में:


public class Printer {   
    public static final Printer PRINTER = new Printer();   
    private Printer() {
    }
//…
}
    

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

Enums का क्रमांकन सामान्य वस्तुओं की तुलना में अलग तरह से काम करता है: केवल Enum नाम का मान क्रमबद्ध होता है। Deserialization के दौरान, एक उदाहरण प्राप्त करने के लिए विधि का उपयोग deserialized नाम के साथ किया जाता है। इसके अतिरिक्त, एनम आपको प्रतिबिंब हमलों से बचा सकता है ।

आप दूसरे मॉड्यूल के पाठों में प्रतिबिंब के बारे में अधिक जानेंगे, जहां हम प्रतिबिंब एपीआई का पता लगाएंगे ।

जावा तत्काल एनमों को प्रतिबंधित करता है - कन्स्ट्रक्टर क्लास की नई इंस्टेंस विधि के कार्यान्वयन में बेक किया गया एक सीमा , जिसे अक्सर प्रतिबिंब के माध्यम से ऑब्जेक्ट बनाते समय कहा जाता है।

Constructor.newInstance से कोड का अंश । एक एनम बनाने के लिए उपयोग किया जाता है :


if ((clazz.getModifiers() & Modifier.ENUM) != 0)
    throw new IllegalArgumentException("Cannot reflectively create enum objects");
    

सिंगलटन बनाने के लिए एनम का उपयोग करने के नुकसान में शामिल हैं:

  • आलसी आरंभीकरण का अभाव, चूंकि वस्तु तुरंत बनाई जाती है और आरंभीकरण में देरी नहीं की जा सकती।

  • अन्य वर्गों को बढ़ाया नहीं जा सकता। यही है, ऐसे मामलों में जहां आपको किसी अन्य वर्ग को प्राप्त करने की आवश्यकता होती है, यह एक सिंगलटन के रूप में एक एनम का उपयोग करने के लिए काम नहीं करेगा। ऐसे मामलों में, हमें पहले से परिचित अन्य कार्यान्वयन विकल्पों की ओर मुड़ने की आवश्यकता है: एक स्थिर विधि या एक सार्वजनिक चर।

  • एक सिंगलटन के रूप में एनम का उपयोग करते समय, आप केवल एक एनम फ़ील्ड का उपयोग कर सकते हैं।


public enum Device extends Electricity { 
    PRINTER 
}
    

यह कोड हमें संकलन त्रुटि देगा:

एनम के लिए कोई विस्तार खंड की अनुमति नहीं है

लेकिन अगर हमें एक इंटरफ़ेस लागू करने की आवश्यकता है, तो कोई समस्या नहीं है, क्योंकि एनम इंटरफेस को लागू कर सकता है:


public enum Device implements Electricity { 
    PRINTER 
}
    

यदि आपको विरासत का उपयोग करने की आवश्यकता नहीं है, तो सिंगलटन पैटर्न को एनम के माध्यम से लागू करना सबसे अच्छा है । हम इसकी सिफारिश करने वाले अकेले नहीं हैं - यहोशू बलोच खुद भी करते हैं

यह कार्यान्वयन दृष्टिकोण आपको सुविधा, कॉम्पैक्टनेस, बॉक्स से बाहर क्रमांकन, प्रतिबिंब हमलों से सुरक्षा, और विशिष्टता देता है - वह सब कुछ जो एक अच्छे सिंगलटन को चाहिए!