जैसा कि कुछ हद तक पहले उल्लेख किया गया है, एक एनम एक जावा वर्ग है जिसकी विशेष स्थिति है कि इसकी परिभाषा कम से कम एक "एनम निरंतर" के साथ शुरू होनी चाहिए।
इसके अलावा, और उस एनम कैंट को बढ़ाया नहीं जा सकता है या अन्य वर्गों को विस्तारित करने के लिए उपयोग किया जाता है, एक एनम किसी भी वर्ग की तरह एक वर्ग है और आप इसे निरंतर परिभाषाओं के नीचे के तरीकों को जोड़कर उपयोग करते हैं:
public enum MySingleton {
INSTANCE;
public void doSomething() { ... }
public synchronized String getSomething() { return something; }
private String something;
}
आप इन लाइनों के साथ सिंगलटन के तरीकों का उपयोग करते हैं:
MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();
एक वर्ग के बजाय एक एनुम का उपयोग, जैसा कि अन्य उत्तरों में उल्लेख किया गया है, ज्यादातर सिंगलटन के थ्रेड-सेफ इंस्टेंटेशन के बारे में और एक गारंटी है कि यह हमेशा केवल एक प्रति होगी।
और, शायद, सबसे महत्वपूर्ण बात यह है कि इस व्यवहार की गारंटी खुद जेवीएम और जावा विनिर्देशन ने दी है।
यहाँ पर जावा विनिर्देशन से एक अनुभाग है कि एनुम इंस्टेंस के कई उदाहरणों को कैसे रोका जाता है:
एक एनुम प्रकार का कोई अन्य उदाहरण नहीं है, जो इसके एनम स्थिरांक द्वारा परिभाषित है। यह स्पष्ट रूप से एक एनम प्रकार को तुरंत करने का प्रयास करने के लिए एक संकलन-समय की त्रुटि है। एनम में अंतिम क्लोन विधि यह सुनिश्चित करती है कि एनम स्थिरांक को कभी भी क्लोन नहीं किया जा सकता है, और धारावाहिक तंत्र द्वारा विशेष उपचार यह सुनिश्चित करता है कि ड्यूरेलाइजेशन के परिणामस्वरूप डुप्लिकेट इंस्टेंसेस कभी नहीं बनाए जाते हैं। Enum प्रकार के चिंतनशील तात्कालिकता निषिद्ध है। साथ में, ये चार बातें यह सुनिश्चित करती हैं कि किसी भी प्रकार के कोई उदाहरण मौजूद नहीं हैं जो कि एनम स्थिरांक द्वारा परिभाषित हैं।
वर्थ नोटिंग यह है कि तात्कालिकता के बाद किसी भी थ्रेड-सेफ्टी चिंताओं को संभाला जाना चाहिए जैसे किसी अन्य वर्ग में सिंक्रोनाइज़्ड कीवर्ड आदि के साथ।