दिलचस्प पोस्ट
मैं इसमें शामिल होने के बजाय LINQ शामिल (स्ट्रिंग ) का उपयोग कैसे करूं? पायथन 2.7 में सबप्रोसेक्शन के आउटपुट को छिपाने के तरीके एंड्रॉइड एसडीके स्थापना जेडीके नहीं मिलती एफओपी में आर और आरबी के बीच अंतर क्या है यूटीएफ -8 सभी तरह से माध्यम से अभिव्यक्ति बनाम विवरण जावा का उपयोग करते हुए समान नेटवर्क (सबनेट) से जुड़े आईपी की सूची कैसे प्राप्त करें I दो तिथियों के बीच के दिनों की संख्या ढूँढना समान नाम के साथ फ़ंक्शन, व्युत्पन्न कक्षा में भिन्न हस्ताक्षर ब्लूटूथ हेडसेट के साथ Android RecognizerIntent का उपयोग करना एंड्रॉइड एम – रनटाइम अनुमति जांचें – यह निर्धारित करने के लिए कि क्या उपयोगकर्ता ने "फिर से कभी पूछें" की जांच नहीं की? उन्नत ज़ीरोएमक्यू सॉकेट प्रकार को समझना एपीके हस्ताक्षर हस्ताक्षर कैसे प्राप्त करें? Ints के लिए अधिकतम और न्यूनतम मान क्यों मैक ओएस पर नोकोगीरी को लिबिकॉन के साथ असफल हो रहा है?

एक एनन के साथ सिंगलटन कार्यान्वित करना (जावा में)

मैंने पढ़ा है कि जावा में Singleton को Enum का उपयोग करना संभव है जैसे कि:

 public enum MySingleton { INSTANCE; } 

लेकिन, उपरोक्त काम कैसे करता है? विशेष रूप से, एक Object को तत्काल करना होगा। यहां, MySingleton को तत्काल कैसे किया जा रहा है? new MySingleton() कौन कर रहा है?

वेब के समाधान से एकत्रित समाधान "एक एनन के साथ सिंगलटन कार्यान्वित करना (जावा में)"

इस,

 public enum MySingleton { INSTANCE; } 

एक निहित खाली कन्स्ट्रक्टर है चलो इसके बजाय स्पष्ट हो,

 public enum MySingleton { INSTANCE; private MySingleton() { System.out.println("Here"); } } 

यदि आपने एक main() विधि के साथ एक और वर्ग जोड़ा है

 public static void main(String[] args) { System.out.println(MySingleton.INSTANCE); } 

तुम देखोगे

 Here INSTANCE 

enum फ़ील्ड समय स्थिरांक संकलित कर रहे हैं, लेकिन वे अपने enum प्रकार के उदाहरण हैं। और, वे तब निर्मित होते हैं जब एन्यूम प्रकार को पहली बार संदर्भ दिया जाता है

इस जावा में सर्वश्रेष्ठ यहोशू ब्लोच की किताबों के अनुसार, आपको समझाया जा सकता है कि सिंगलटन की संपत्ति को निजी कंस्ट्रक्टर या एनोम प्रकार के साथ क्यों लागू करना चाहिए। अध्याय काफी लंबा है, इसलिए इसे संक्षेप में रखते हुए:

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

 // Enum singleton - the preferred approach public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } } 

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

हालांकि इस दृष्टिकोण को अभी तक व्यापक रूप से अपनाया नहीं गया है, सिंगल-एंट एन्यूम प्रकार सिंगलटन को कार्यान्वित करने का सबसे अच्छा तरीका है।

एक enum प्रकार एक विशेष प्रकार का class प्रकार है।

आपकी enum घोषणा वास्तव में कुछ की तरह संकलित होती है

 public final class MySingleton { public final static MySingleton INSTANCE = new MySingleton(); } 

जब आपका कोड पहली बार INSTANCE तक पहुंचता है, तो क्लास MySingleton को जेवीएम द्वारा लोड और आरंभ किया जाएगा। यह प्रक्रिया static फ़ील्ड एक बार ऊपर (आलसी) को आरंभ करती है।

सभी एन्यूम उदाहरणों की तरह, जावा हर वस्तु को तत्काल तभी पेश करता है जब क्लास लोड हो जाता है, कुछ गारंटी के साथ कि यह जेवीएम प्रति एक बार ठीक हो गया है। एक सार्वजनिक स्थिर अंतिम क्षेत्र के रूप में INSTANCE घोषणा के बारे में सोचें: जावा पहली बार वर्ग को संदर्भित करने के लिए ऑब्जेक्ट को इन्स्तांत करेगा।

उदाहरणों को स्थैतिक आरंभीकरण के दौरान बनाया जाता है, जिसे जावा भाषा विशिष्टता, खंड 12.4 में परिभाषित किया गया है।

इसके लायक होने के लिए, यहोशू ब्लोच ने इस पैटर्न को प्रभावी जावा द्वितीय संस्करण के आइटम 3 के रूप में विस्तार से वर्णित किया है।

चूंकि सिंगलटन पैटर्न एक निजी कन्स्ट्रक्टर होने के बारे में है और getInstance को नियंत्रित करने के लिए कुछ तरीके कॉल करने के बारे में है (जैसे कि कुछ getInstance ), Enums में हमारे पास पहले से ही एक निहित निजी निर्माता है।

मुझे बिल्कुल नहीं पता है कि जेवीएम या कुछ कंटेनर हमारे Enums के उदाहरणों को कैसे नियंत्रित करता है, लेकिन ऐसा लगता है कि पहले से ही एक गठबंधन Singleton Pattern , अंतर यह है कि हम एक getInstance कॉल नहीं करते हैं, हम सिर्फ getInstance बुलाते हैं।

 enum Checks { INSTANCE; Checks() { System.out.println("checks"); } public void dowork() { System.out.println(" do work please "); } } public class EnumSingelton { public static void main(String[] args) { Checks.INSTANCE.dowork(); } }