2012-10-02 22 views
14

जावा एनम आधारित सिंगलटन को शुरू करने का सही तरीका क्या है, अगर मुझे ऑब्जेक्ट का उपयोग करने से पहले इसे प्रारंभ करना है।जावा एनम आधारित सिंगलटन कैसे प्रारंभ करें?

मैंने कोड लिखना शुरू कर दिया है, लेकिन मुझे यकीन नहीं है कि मैं इसे सही कर रहा हूं। क्या आप इस सिंगलटन को मेरे लिए सही लागू करने में मेरी मदद कर सकते हैं?

public enum BitCheck { 

    INSTANCE; 

    BitCheck() { 
     props = new HashMap<String, String>(); 
    } 

    private final Map<String, String> props; 

    //.. 

} 

ध्यान दें कि:

public enum BitCheck { 

    INSTANCE; 

    private static HashMap<String, String> props = null; 

    public synchronized void initialize(HashMap<String, String> properties) { 
     if(props == null) { 
      props = properties; 
     } 
    } 

    public boolean isAenabled(){ 
     return "Y".equalsIgnoreCase(props.get("A_ENABLED")); 
    } 

    public boolean isBenabled(){ 
     return "Y".equalsIgnoreCase(props.get("B_ENABLED")); 
    } 

} 
+0

मुझे यह पसंद नहीं है, आप क्या हासिल करने की कोशिश कर रहे हैं? – zengr

+0

जब आप पहले से ही सिंगलटन का उपयोग कर रहे हैं तो आपको केवल एक तत्व के साथ enum की आवश्यकता क्यों है? – Dunes

+0

@ ड्यून्स मैं एक सिंगलटन चाहता हूं ताकि मैं मूल्यों की जांच के लिए अपने कोड बेस पर इसका उपयोग कर सकूं। मैं स्टार्टअप के दौरान संपत्तियों के साथ शुरूआत करूंगा और पूरे प्रोजेक्ट में चेक विधियों का उपयोग करूंगा। –

उत्तर

30

यह enum के लिए निर्माता बनाने के लिए पूरी तरह से संभव है

  • props क्षेत्र अंतिम हो सकता है (हम final की तरह)
  • props नहीं है static
  • होना
  • कन्स्ट्रक्टर को आपके लिए स्वचालित रूप से और उत्सुकता से बुलाया जाता है

अंतिम बिंदु पर ध्यान दें। चूंकि enum -singletons उत्सुकता से बनाए जाते हैं जब enum BitCheck कक्षा लोड हो जाती है, तो आपके पास कन्स्ट्रक्टर को कोई भी तर्क पारित करने का कोई तरीका नहीं है।

public enum BitCheck { 

    INSTANCE(new HashMap<String, String>()); 

    BitCheck(final Map<String, String> props) { 
     this.props = props; 
    } 

लेकिन यह कोई अंतर है, सही नहीं है: बेशक आप INSTANCE घोषणा के जरिए कर सकते हैं? आपकी क्या प्राप्त करने की इच्छा है? शायद आपको आलसी-प्रारंभिक सिंगलटन की ज़रूरत है?

+0

मुझे लगता है कि ऐसा करने के लिए यह बुरा विचार होगा क्योंकि कन्स्ट्रक्टर कुछ भी अच्छा नहीं पेश करता है। यह सरल घोषणा –

+0

हो सकती है मैं मूल्यों के एक सेट के साथ आरंभ करना चाहता हूं, जिसे मैं इसे सिंगलटन में पास करना चाहता हूं। मैं उसे कैसे कर सकता हूँ? आपका उदाहरण खाली हैशप के साथ शुरू हो रहा है। –

+1

@java_mouse: यह बात है। बाहर से कन्स्ट्रक्टर को कुछ भी पास करने का कोई तरीका नहीं है, 'एनम' सिंगलटन आपकी मदद नहीं करेगा। –

2

आप इस प्रकार का निर्माता परिभाषित करने की जरूरत:

public enum BitCheck { 

    INSTANCE; 
    private final HashMap<String, String> props; 

    BitCheck() { 

    } 
} 

एक बहुत अच्छा उदाहरण में ग्रह enum है: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

1
public enum BitCheck { 

    INSTANCE; 

    private BitCheck() { 
     // initialize here 
    } 

} 
5

आपको इसे घोषणा में आरंभ करना होगा।

public enum BitCheck { 
    INSTANCE; 
    private final Map<String, String> props = new ConcurrentHashMap<String, String>(); 

    public void putAll(HashMap<String, String> map) { 
     props.putAll(map); 
    } 
} 
+0

+1, आपको किसी भी तरह से 'props' सिंक्रनाइज़ करना चाहिए। –

+0

यूप। धन्यवाद इसे बदल दिया। –

0

आप अपने एनम आधारित सिंगलटन कोड के भीतर ऐसा कुछ करने का प्रयास कर सकते हैं। यह सुनिश्चित करेगा कि सिंगलटन को एक बार शुरू किया जा सकता है।

private static Properties props; 
private static AtomicBoolean isInitialized = new AtomicBoolean(false); 

public void init(Properties props){ 
    if(isInitialized.compareAndSet(false, true)) { 
     this.props = props; 
    } 
} 

नोट: और अधिक जटिल आरंभीकरण के लिए, आप initStarted और initCompleted के लिए 2 AtomicBooleans की आवश्यकता होगी (एकल AtomicBoolean के बजाय - isInitialized)। फिर पहला धागा initStarted सेट करता है और प्रारंभिक चरणों को निष्पादित करता है, शेष प्रतीक्षा करें जब तक initplepleted को पहले थ्रेड द्वारा सत्य पर सेट नहीं किया जाता है।

संबंधित मुद्दे