एनम एकल के साथ कुछ समस्याएं:
एक कार्यान्वयन रणनीति के लिए प्रतिबद्ध
आमतौर पर, "सिंगलटन" एक कार्यान्वयन रणनीति को संदर्भित करता है, एपीआई विनिर्देश नहीं। Foo1.getInstance()
सार्वजनिक रूप से यह घोषित करना बहुत दुर्लभ है कि यह हमेशा एक ही उदाहरण लौटाएगा। यदि आवश्यक हो, के कार्यान्वयन को Foo1.getInstance()
विकसित कर सकते हैं, उदाहरण के लिए, प्रति धागा एक उदाहरण वापस करने के लिए।
साथ Foo2.INSTANCE
हम सार्वजनिक रूप से घोषणा की कि इस उदाहरण है उदाहरण है, और वहाँ है कि बदलने के लिए कोई मौका नहीं है। एकल उदाहरण होने की कार्यान्वयन रणनीति उजागर और के लिए प्रतिबद्ध है।
यह समस्या अपंग नहीं है। उदाहरण के लिए, प्रभावी रूप से प्रति-थ्रेड उदाहरण के लिए, Foo2.INSTANCE.doo()
थ्रेड स्थानीय सहायक ऑब्जेक्ट पर भरोसा कर सकते हैं ।
विस्तार Enum वर्ग
Foo2
एक सुपर क्लास बढ़ाता है Enum<Foo2>
। हम आमतौर पर सुपर क्लास से बचना चाहते हैं; विशेष रूप से इस मामले में, जिस सुपर क्लास को मजबूर किया गया है Foo2
उसका कोई लेना-देना नहीं Foo2
है। यह हमारे आवेदन के प्रकार पदानुक्रम के लिए एक प्रदूषण है। यदि हम वास्तव में एक सुपर क्लास चाहते हैं, तो आमतौर पर यह एक एप्लीकेशन क्लास है, लेकिन हम Foo2
सुपर क्लास तय नहीं कर सकते ।
Foo2
कुछ मजेदार इंस्टेंस विधियों को विरासत में मिला है name(), cardinal(), compareTo(Foo2)
, जो केवल Foo2
उपयोगकर्ताओं के लिए भ्रामक हैं । यहां तक कि अगर इस पद्धति के इंटरफ़ेस में वांछनीय है, Foo2
तो इसकी अपनी name()
विधि नहीं हो सकती Foo2
।
Foo2
कुछ मज़ेदार स्टैटिक विधियाँ भी शामिल हैं
public static Foo2[] values() { ... }
public static Foo2 valueOf(String name) { ... }
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
जो उपयोगकर्ताओं के लिए निरर्थक प्रतीत होता है। एक सिंगलटन में आमतौर पर पल्बिक स्टैटिक तरीके नहीं होने चाहिए (इसके अलावा अन्य getInstance()
)
serializability
यह बहुत ही सामान्य है कि सिंगलनेट्स स्टेटफुल हों। ये एकलव्य आमतौर पर क्रमिक नहीं होने चाहिए। मैं किसी भी यथार्थवादी उदाहरण के बारे में नहीं सोच सकता, जहां यह एक वीएम से दूसरे वीएम में एक स्टेटफुल सिंगलटन को ट्रांसपोर्ट करने के लिए समझ में आता है; एक सिंगलटन का अर्थ है "एक वीएम के भीतर अद्वितीय", न कि "ब्रह्मांड में अद्वितीय"।
यदि सीरियलाइज़ेशन वास्तव में एक स्टेटफुल सिंगलटन के लिए समझ में आता है, तो सिंगलटन को स्पष्ट रूप से और सटीक रूप से यह निर्दिष्ट करना चाहिए कि किसी अन्य वीएम में एक सिंगलटन को डिसेर्बलाइज करने का क्या मतलब है, जहां एक ही प्रकार का एक सिंगलटन पहले से मौजूद हो सकता है।
Foo2
स्वचालित रूप से एक सरलीकृत सरलीकरण / deserialization रणनीति के लिए प्रतिबद्ध है। वह तो बस हादसा होने का इंतजार है। यदि हमारे पास डेटा का एक पेड़ है जो वैचारिक रूप Foo2
से VM1 के एक राज्य चर को t1 पर संदर्भित करता है , क्रमबद्धता / विचलन के माध्यम से मान एक अलग मूल्य बन जाता है - Foo2
t2 पर VM2 में एक ही चर का मान , बग का अन्वेषण करने के लिए एक कठिन बनाता है। यह बग अनजाने में Foo1
चुपचाप नहीं होगा ।
कोडिंग के प्रतिबंध
ऐसी चीजें हैं जो सामान्य कक्षाओं में की जा सकती हैं, लेकिन enum
कक्षाओं में निषिद्ध हैं। उदाहरण के लिए, कंस्ट्रक्टर में एक स्थिर क्षेत्र तक पहुंचना। प्रोग्रामर को अधिक सावधान रहना होगा क्योंकि वह एक विशेष वर्ग में काम कर रहा है।
निष्कर्ष
एनम पर पिग्गीबैक करके, हम कोड की 2 लाइनों को बचाते हैं; लेकिन कीमत बहुत अधिक है, हमें सभी बैगेज और एनम के प्रतिबंधों को ले जाना होगा, हम अनजाने में एनम के "सुविधाओं" को अनजाने में परिणाम देते हैं। एकमात्र कथित लाभ - स्वचालित क्रमबद्धता - नुकसान का कारण बनता है।