2011-11-06 84 views
23

我讀了很多關於使用枚舉創建單例類的stackoverflow。 我一定錯過了一些東西,因爲我無法到達任何地方的實例。使用枚舉的單例使用枚舉

這是我的代碼:

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. 

但是Eclipse的代碼完成未發現任何

謝謝!

+0

請看這裏http://www.drdobbs.com/jvm/creating-and-destroying-java-objects-par/208403883?pgno=3 – alexsmail

回答

52

訣竅是使枚舉本身是單例。試試這個:

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

INSTANCESingleton一員,而不是UserActivity - 所以你需要:

UserActivity.Singleton.INSTANCE.getSingleton(); 

但是,你有沒有實際作出UserActivity單身 - 通常你會做的類型本身的枚舉,不嵌入枚舉類型...

+0

Hiya .. for某些原因,我仍然有點失落。我以前從未使用過單身類的枚舉。介意顯示一個小例子? – 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();

不能調用構造函數(*),你可以在私人枚舉通過實例只得到您的UserActivity()類的一個實例 - 保證一次且只能創建一次

+0

這並不比接受的答案更好。 – NimChimpsky

+0

@NimC:哦,來吧 - 是的。 ufk使用的Lazy Load單例模式是一個衆所周知的敵人(:P),並試圖使其工作 - 接受的答案只是將頂層的枚舉簡化爲一些東西 –

+0

enum只會加載無論如何(通過類加載器),這沒有任何優勢。 – NimChimpsky