enum

2011-11-06 18 views
23

का उपयोग कर सिंगलटन मैंने एनम का उपयोग करके सिंगलटन कक्षाओं के निर्माण के संबंध में स्टैक ओवरफ्लो पर बहुत कुछ पढ़ा। मुझे कुछ याद करना होगा क्योंकि मैं कहीं भी इंस्टेंस तक नहीं पहुंच सकता।enum

public class UserActivity { 

    private DataSource _dataSource; 
    private JdbcTemplate _jdbcTemplate; 

    static enum Singleton { 
     INSTANCE; 

     private static final UserActivity singleton = new UserActivity(); 

     public UserActivity getSingleton() { 
      return singleton; 
     } 
    } 

    public UserActivity() { 
     this._dataSource = MysqlDb.getInstance().getDataSource(); 
     this._jdbcTemplate = new JdbcTemplate(this._dataSource); 
    } 

    public void dostuff() { 
    ... 
    } 
} 

और मैं

UserActivity.INSTANCE.getSingleton() 

या

UserActivity.Singleton. 

लेकिन ग्रहण के कोड पूर्णता नहीं मिल रहा है कुछ भी

करने के लिए कोशिश कर रहा हूँ बाहर:

इस

मेरी कोड है

धन्यवाद!

+0

यहां देखें http://www.drdobbs.com/jvm/creating-and-destroying-java-objects-par/208403883?pgno=3 – alexsmail

उत्तर

52

चाल enum खुद को सिंगलटन बनाने के लिए है। इस प्रयास करें:

public enum UserActivity { 
    INSTANCE; 

    private DataSource _dataSource; 
    private JdbcTemplate _jdbcTemplate; 

    private UserActivity() { 
     this._dataSource = MysqlDb.getInstance().getDataSource(); 
     this._jdbcTemplate = new JdbcTemplate(this._dataSource); 
    } 

    public void dostuff() { 
    ... 
    } 
} 

// use it as ... 
UserActivity.INSTANCE.doStuff(); 
+0

चीजों को साफ़ करने के लिए धन्यवाद :) – ufk

13

INSTANCE, Singleton का एक सदस्य है UserActivity की नहीं - तो आप आवश्यकता होगी:

UserActivity.Singleton.INSTANCE.getSingleton(); 

हालांकि, अगर आप वास्तव में UserActivity एक सिंगलटन बना दिया है - आम तौर पर आप प्रकार अपने आप में एक enum बनाने चाहते हैं , के भीतर एक enum प्रकार को एम्बेड न करें ...

+0

Hiya .. के लिए कुछ कारण मैं अभी भी खो गया हूँ। मैंने पहले कभी सिंगलटन कक्षा के लिए enum का उपयोग नहीं किया था। दिमाग एक छोटा सा उदाहरण दिखा रहा है? – ufk

1
public class UserActivity { 

    private DataSource _dataSource; 
    private JdbcTemplate _jdbcTemplate; 

    private static enum Singleton { // private, why not 
     INSTANCE; 

     private static final UserActivity singleton = new UserActivity(); 

     public UserActivity getSingleton() { 
      return singleton; 
     } 
    } 

    private UserActivity() { // private !!(*) 
     this._dataSource = MysqlDb.getInstance().getDataSource(); 
     this._jdbcTemplate = new JdbcTemplate(this._dataSource); 
    } 


    public static UserActivity getInstance() { 
    return UserActivity.Singleton.INSTANCE.getSingleton(); 
    } 

    public void dostuff() { 
    ... 
    } 
} 

और फोन UserActivity.getInstance().doStuff();

आप निर्माता (*) कॉल नहीं कर सकते हैं और आप केवल निजी enum में उदाहरण के माध्यम से अपने UserActivity() वर्ग का एक उदाहरण प्राप्त कर सकते हैं - जिसे एक बार बनाया जाना चाहिए और केवल

+0

यह स्वीकृत उत्तर से बेहतर नहीं है। – NimChimpsky

+0

@ एनआईएमसी: ओह आओ - यह है। ufk आलसी लोड सिंगलटन पैटर्न का उपयोग कर रहा था जिसमें से आप एक प्रसिद्ध दुश्मन (पी) हैं और इसे काम करने की कोशिश कर रहे थे - स्वीकृत उत्तर सिर्फ शीर्ष स्तर पर enum ले रहा था चीजों को सरल बनाना –

+0

enum केवल लोड हो जाएगा वैसे भी मांग (क्लासलोडर द्वारा), इसका कोई फायदा नहीं है। – NimChimpsky