जावा में एक सिंगलटन के रूप में एनम का उपयोग करने के लिए सबसे अच्छा तरीका क्या है?


85

एसओ प्रश्न में जो लिखा गया है उस पर भवन निर्माण करना जावा में सर्वश्रेष्ठ सिंगलटन इम्प्लीमेंटेशन - अर्थात् एक सिंगलटन बनाने के लिए एनम का उपयोग करने के बारे में - क्या अंतर / पेशेवरों / विपक्ष के बीच हैं (निर्माणकर्ता छोड़ा गया)

public enum Elvis {
    INSTANCE;
    private int age;

    public int getAge() {
        return age;
    }
}

और फिर कॉलिंग Elvis.INSTANCE.getAge()

तथा

public enum Elvis {
    INSTANCE;
    private int age;

    public static int getAge() {
        return INSTANCE.age;
    }
}

और फिर कॉलिंग Elvis.getAge()

जवाबों:


96

मान लीजिए कि आप किसी ऐसी चीज़ के लिए बाध्य कर रहे हैं, जो किसी भी वस्तु के गुणों का उपयोग करेगी - आप एल्विस पास कर सकते हैं। बहुत आसानी से, लेकिन आप एल्विस पास नहीं कर सकते हैं और यह संपत्ति खोजने की उम्मीद कर सकते हैं (जब तक कि इसे खोजने के लिए जानबूझकर कोडित नहीं किया गया हो। वर्गों के स्थिर गुण)।

मूल रूप से आप केवल सिंगलटन पैटर्न का उपयोग करते हैं जब आप एक उदाहरण चाहते हैं । यदि स्थिर विधियाँ आपके लिए ठीक काम करती हैं, तो बस उन का उपयोग करें और एनम से परेशान न हों।


1
एनम से परेशान क्यों नहीं? क्या java5 + में सिंगलटन करने का एक बेहतर तरीका है?
जोंत्रो

4
@jontro (re) उत्तर पढ़ें; वह enums उपयोग करने के लिए जब आप से बचने के लिए एक सिंगलटन सिंगलटन लेकिन होना आवश्यक है यदि आप कर सकते हैं स्थिर तरीकों के साथ क्या कहते हैं
दुखी चर

@MableableVariable मैंने एक साल पहले इस पर टिप्पणी की थी। खिचड़ी भाषा वास्तव में याद है कि मैं किस संदर्भ का उल्लेख कर रहा था।
जोंत्रो

पूछे गए सवाल का जवाब नहीं है
23

2
@ तुफिर: यह "क्या अंतर है" भाग का जवाब देता है - जो प्रतीत होता है कि ओपी को सबसे अधिक दिलचस्पी थी, यह देखते हुए कि उत्तर स्वीकार किया गया था।
जॉन स्कीट

69

एक बड़ा फायदा यह है कि जब आपके सिंगलटन को एक इंटरफ़ेस लागू करना होगा। अपने उदाहरण के बाद:

public enum Elvis implements HasAge {
    INSTANCE;
    private int age;

    @Override
    public int getAge() {
        return age;
    }
}

साथ में:

public interface HasAge {
    public int getAge();
}

यह स्टैटिक्स के साथ नहीं किया जा सकता ...


1
यह स्टैटिक्स के साथ किया जा सकता है ... सार्वजनिक स्थैतिक अंतिम हस इन्स्टेंस = नया हसगेज () {निजी इंट एज; @ ओवरराइड सार्वजनिक int getAge () {वापसी आयु; }}; ... तो मैं अभी भी सोच रहा हूं कि एनम विधि के बारे में क्या अच्छा है या बेहतर है। अगर आपको दो इंटरफेस लागू करने की आवश्यकता है तो मुझे लगता है?
सीन एडकिंसन

9

(स्टेटफुल) सिंगलेट्स आमतौर पर स्टेटिक वैरिएबल का उपयोग न करने के बहाने किया जाता है। यदि आप वास्तव में सार्वजनिक रूप से स्थिर वैरिएबल का उपयोग नहीं करते हैं तो आप कम लोगों को बेवकूफ बनाएंगे।


8

मैं वह विकल्प चुनूंगा जो सबसे सरल और स्पष्ट हो। यह कुछ हद तक व्यक्तिपरक है, लेकिन यदि आप नहीं जानते कि क्या स्पष्ट है, तो सबसे छोटा विकल्प चुनें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.