तुम्ही अलीकडेच सिंगलटन डिझाइन पॅटर्न , ते Java मध्ये कसे अंमलात आणायचे आणि ते कशासाठी आहे याचा शोध घेतला. पण जर मी तुम्हाला सांगितले की जावा बॉक्समधून स्वतःचा सिंगलटन घेऊन येतो? उत्सुकता आहे? चला तर मग आत जाऊया.

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

सिंगलटन enum म्हणून:


public enum Device {   
    PRINTER	
} 
    

सिंगलटन सार्वजनिक चल म्हणून:


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

सार्वजनिक-क्षेत्राच्या दृष्टिकोनापेक्षा enum दृष्टिकोन अधिक संक्षिप्त आहे, कारण आम्हाला स्वतःची अंमलबजावणी लिहिण्याची आवश्यकता नाही. सर्वात महत्त्वाचे म्हणजे, एनम्सला सीरियलायझेशनमध्ये कोणतीही समस्या नाही.

एनम्सचे सीरियलायझेशन सामान्य वस्तूंपेक्षा वेगळ्या पद्धतीने कार्य करते: केवळ एनम नावाचे मूल्य अनुक्रमित केले जाते. डीसीरियलायझेशन दरम्यान, उदाहरण मिळविण्यासाठी डीसीरियलाइज्ड नावासह पद्धत वापरली जाते. याव्यतिरिक्त, enum परावर्तन हल्ल्यांपासून आपले संरक्षण करू शकते .

तुम्ही दुसऱ्या मॉड्यूलमधील धड्यांमध्ये परावर्तनाबद्दल अधिक जाणून घ्याल, जिथे आम्ही रिफ्लेक्शन API एक्सप्लोर करू .

जावा एनम्स इन्स्टंट करणे प्रतिबंधित करते — कन्स्ट्रक्टर क्लासच्या नवीन इंस्टन्स पद्धतीच्या अंमलबजावणीमध्ये बेक केलेली मर्यादा , ज्याला प्रतिबिंबाद्वारे ऑब्जेक्ट्स तयार करताना म्हणतात.

Constructor.newInstance कडील कोडचा उतारा . enum तयार करण्यासाठी वापरले जाते :


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

सिंगलटन तयार करण्यासाठी एनम वापरण्याच्या तोट्यांमध्ये हे समाविष्ट आहे:

  • आळशी प्रारंभाचा अभाव, कारण ऑब्जेक्ट ताबडतोब तयार केला जातो आणि प्रारंभास विलंब होऊ शकत नाही.

  • इतर वर्ग वाढवता येत नाहीत. म्हणजेच, ज्या प्रकरणांमध्ये तुम्हाला दुसर्‍या वर्गाचा वारसा घ्यायचा असेल, त्यामध्ये सिंगलटन म्हणून enum वापरणे कार्य करणार नाही . अशा परिस्थितीत, आम्हाला आधीच परिचित असलेल्या इतर अंमलबजावणी पर्यायांकडे वळणे आवश्यक आहे: एक स्थिर पद्धत किंवा सार्वजनिक चल.

  • सिंगलटन म्हणून enum वापरताना, तुम्ही फक्त एक enum फील्ड वापरू शकता.


public enum Device extends Electricity { 
    PRINTER 
}
    

हा कोड आम्हाला संकलन त्रुटी देईल:

enum साठी कोणत्याही विस्तारित कलमाला परवानगी नाही

परंतु जर आम्हाला इंटरफेस लागू करण्याची आवश्यकता असेल तर कोणतीही अडचण नाही, कारण enum इंटरफेस लागू करू शकते:


public enum Device implements Electricity { 
    PRINTER 
}
    

तुम्हाला वारसा वापरण्याची आवश्यकता नसल्यास, enum द्वारे सिंगलटन पॅटर्न लागू करणे चांगले . याची शिफारस करण्यात आम्ही एकटे नाही — जोशुआ ब्लोच स्वतः देखील तसेच करतो .

अंमलबजावणीचा हा दृष्टीकोन तुम्हाला सुविधा, कॉम्पॅक्टनेस, बॉक्सच्या बाहेर सीरियलायझेशन, रिफ्लेक्शन अॅटॅकपासून संरक्षण आणि वेगळेपण देतो — चांगल्या सिंगलटनला आवश्यक असलेली प्रत्येक गोष्ट!