2011-11-06 81 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